【发布时间】:2023-03-21 21:00:01
【问题描述】:
如果子查询没有返回结果或返回空值,我需要替换 WHERE 子句中的值。
按要求工作的价格查询
运行成功
SELECT `prices` FROM `pricing`
WHERE (3 BETWEEN `from_unit` AND `to_unit`)
AND `type` = 1
AND `id_pricing` IN
(
SELECT v1.`id_pricing` FROM `values` AS v1
INNER JOIN `values` AS v2 ON v1.`id_pricing` = v2.`id_pricing`
INNER JOIN `values` AS v3 ON v1.`id_pricing` = v3.`id_pricing`
INNER JOIN `values` AS v4 ON v1.`id_pricing` = v4.`id_pricing`
WHERE v1.`id_attribute` = 1 AND v1.`id_value` = 1
AND v2.`id_attribute` = 7 AND v2.`id_value` = 63
AND v3.`id_attribute` = 8 AND v3.`id_value` = 87
AND v4.`id_attribute` = 12 AND v4.`id_value` = 143
)
当我如下修改这个查询时,在 IN 子句中添加对子查询的 IFNULL 检查,它会抛出错误
'SQL 错误 (1242):子查询返回多于 1 行'
SELECT `prices` FROM `pricing`
WHERE (3 BETWEEN `from_unit` AND `to_unit`)
AND `type` = 1
AND `id_pricing` IN
( IFNULL (
( SELECT v1.`id_pricing` FROM `values` AS v1
INNER JOIN `values` AS v2 ON v1.`id_pricing` = v2.`id_pricing`
INNER JOIN `values` AS v3 ON v1.`id_pricing` = v3.`id_pricing`
INNER JOIN `values` AS v4 ON v1.`id_pricing` = v4.`id_pricing`
WHERE v1.`id_attribute` = 1 AND v1.`id_value` = 1
AND v2.`id_attribute` = 7 AND v2.`id_value` = 63
AND v3.`id_attribute` = 8 AND v3.`id_value` = 87
AND v4.`id_attribute` = 12 AND v4.`id_value` = 143
),
'1234'
)
)
我尝试用 COALESCE 替换 IFNULL 仍然是相同的结果。我是否使用了错误的语法。
【问题讨论】:
-
为什么不在子查询中
SELECT IFNULL(v1.id_pricing, '1234')? -
这里有一个类似的问题有一个解决方案:stackoverflow.com/questions/9861171/…
-
我被那个子查询弄糊涂了。它应该做什么?考虑通过演示的方式提供一个 sqlfiddle
-
@ExplosionPills 确实尝试了您的解决方案,但无济于事。如果没有找到结果,它只返回空集,而不是'1234'
-
@Gimmy,感谢您指出类似的情况,但是当我需要检查每个连接时,该解决方案适用。在我的情况下,如果整个子查询没有返回结果(null),我希望替换结果。我的子查询有多个连接,有时可能 1 个连接可能不返回任何结果,但它们的组合仍然会产生结果。
标签: mysql null subquery ifnull