【问题标题】:MYSQL is not null, not skipping results that are nullMYSQL 不为空,不跳过为空的结果
【发布时间】:2020-12-10 05:35:20
【问题描述】:

我认为我已正确构建此查询以跳过为 NULL 但仍显示 NULL 行的结果:

SELECT post_id, 
       MAX(CASE WHEN meta_key = '_payment_meta' 
                THEN meta_value 
                END) as 'DeliveryDate' 
FROM postmeta 
WHERE 'DeliveryDate' IS NOT NULL 
GROUP BY post_id

仍然显示 NULL 结果的地方遗漏了什么?

【问题讨论】:

    标签: mysql null


    【解决方案1】:
    1. 单引号字符' 用于引用字符串文字,引用列名必须使用反引号字符。 WHERE 'DeliveryDate' IS NOT NULL 检查字符串文字 'DeliveryDate' 是否不是始终为 TRUE 的空值 - 即这个条件什么都不做。
    2. 输出列名不能在 WHERE 中使用 - 执行 WHERE 子句时它不存在(当然是正式的)。如果您需要使用输出列的条件,则必须将其放在 HAVING 子句中。

    所以:

    SELECT post_id, 
           MAX(CASE WHEN meta_key = '_payment_meta' 
                    THEN meta_value 
                    END) as `DeliveryDate`
    FROM postmeta 
    GROUP BY post_id
    HAVING `DeliveryDate` IS NOT NULL 
    

    另一方面 - 你需要 post_idmeta_key = '_payment_meta' - 所以你可以在分组之前过滤行并做简单的事情

    SELECT post_id,
           MAX(meta_value) as `DeliveryDate`
    FROM postmeta 
    WHERE meta_key = '_payment_meta' 
    GROUP BY post_id
    

    这个查询也会做同样的事情。

    如果 (post_id, meta_key, meta_value) 被定义为 UNIQUE(如果表只存储实际数据而不是值历史记录,这是合乎逻辑的),那么查询可以简化为

    SELECT post_id,
           meta_value as `DeliveryDate`
    FROM postmeta 
    WHERE meta_key = '_payment_meta' 
    

    【讨论】:

    • 非常感谢。就是这样!
    【解决方案2】:

    WHERE 子句中的“DeliveryDate”被解释为字符串文字......因此 IS NOT NULL

    【讨论】:

    • 非常感谢。您的答案结合上面的答案解决了这个问题
    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多