【问题标题】:MySQL check if subquery return NULL, then replace valueMySQL检查子查询是否返回NULL,然后替换值
【发布时间】: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


【解决方案1】:

可能将其移至 LEFT JOIN 并检查是否有记录或定价为 1234:-

SELECT `prices` 
FROM `pricing`
LEFT OUTER JOIN
(
    SELECT v1.`id_pricing`, COUNT(*)
    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
    GROUP BY v1.`id_pricing`
) Sub1
ON Sub1.id_pricing = pricing.id_pricing
WHERE (3 BETWEEN `from_unit` AND `to_unit`)
AND `type` = 1
AND (Sub1.`id_pricing` IS NOT NULL
OR pricing.id_pricing = '1234')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多