【问题标题】:Why does <> 'null' works in MySQL?为什么 <> 'null' 在 MySQL 中有效?
【发布时间】:2018-12-19 13:00:01
【问题描述】:

希望这个问题不要太笼统。在网站或 SQL 文档中找不到任何内容:

在编码时,我对此进行了测试,令我惊讶的是它起作用了:

SELECT * FROM cal_entry WHERE cal_entry.parent_id <> 'null'

它实际上显示了没有带有NULL 值的行(这些是数据库中的真实NULL 值,而不是内部带有'null' 的字符串)。

根据文档,我当然应该使用NOT NULL。顺便说一句,它不适用于= 'null',就像文档中正确说明的那样。

谁能解释一下?

【问题讨论】:

    标签: mysql sql comparison


    【解决方案1】:

    您正在选择&lt;&gt; 'null' 为真的所有行。

    比较(等于或不等于)null 为 null,因此如果 cal_entry.parent_id 为 null 的行,您的条件将为 false/null。

    因此,您的查询将获取所有非空行,也不包含字符串“空”。

    (注意,你也可以写成&lt;&gt;'something_else'

    【讨论】:

    • 是的,你是对的,这是逻辑,我应该多考虑一下,谢谢!
    【解决方案2】:

    假设parent_idint 列中,查询将返回所有非空、非零行:

    SELECT *
    FROM (
        SELECT NULL AS parent_id UNION ALL
        SELECT 0 UNION ALL
        SELECT 1 UNION ALL
        SELECT 2
    ) AS cal_entry
    WHERE cal_entry.parent_id <> 'null'
    -- returns 1 and 2 but not 0!
    

    当将数字与字符串进行比较时,MySQL 会将字符串转换为数字。一些例子:

    • 'null' 变为 0
    • 'asdf' 变为 0
    • '1asdf' 变为 123
    • '1' 变为 1

    您的查询将如下所示:

    WHERE cal_entry.parent_id <> 0
    

    【讨论】:

    • 是的,这应该是公认的答案,因为我在0 使用parent_id 进行了测试,它实际上已从结果中过滤掉。谢谢
    【解决方案3】:

    这个运算符给你不等于的结果。前任。 $var != 空。 我们在mysql中写为。这是一种验证,值永远不应该等于 null。

    【讨论】:

      【解决方案4】:

      当使用 null 时,应始终注意以下两个语句 -

      1. 表达式可以为 null,但永远不能等于 null。
      2. 两个空值永远不会相等。

      因此,在您的查询中,只要有比较 null&lt;&gt;null,它就会通过第二条语句返回 true。

      此外,请始终考虑某些行可能包含 null 的可能性 -

      Select * from cal_entry where cal_entry.parent_id!=10
      

      此查询将忽略具有空条目的行。而是使用 -

      Select * from cal_entry where cal_entry.parent_id!=10 or cal_entry.parent_id is null
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多