【问题标题】:T SQL check null syntax confusionT SQL 检查空语法混淆
【发布时间】:2018-12-05 14:59:31
【问题描述】:

我继续编写 SQL Server 中值为 null 的 select 语句为

SELECT * 
FROM TABLE_1 
WHERE VALUE = NULL

不正确

而不是

SELECT * 
FROM TABLE_1 
WHERE VALUE IS NULL

是什么原因IS在值为null时用于检查值,而=在值为整数或字符串时使用?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    原因是NULL不是价值,而是缺乏价值。 ANSI 标准规定检查 NULL = NULLNULL <> NULL 都不会返回 true,而是返回 NULL。将 NULL 视为“未知值”。如果你比较3=3,它会返回true,但如果你比较is some number, that I do not know, equal to some other number, which I do not know either,很明显的结果是I do not know are they equal

    您可能还想看看ANSI_NULLS 选项。

    【讨论】:

    • 你不想乱用set ansi nulls - 它已被弃用,并且将始终在 SQL SERVER 的下一个版本中启用。
    【解决方案2】:

    因为VALUE=NULL 给出NULL 的结果,如果你在WHERE 语句中使用它,它将被处理false,就像你使用NOT VALUE=NULL这也评估为NULL
    让我解释一下上述内容,只是为了澄清我何时说视为虚假
    如果你在你的声明中使用:

    WHERE value = NULL
    

    WHERE NOT (value = NULL)
    

    你不会得到任何行。
    如果你使用:

    WHERE value = NULL AND id = 1
    

    同样,您不会得到任何行。
    但是如果您使用:

    WHERE value = NULL OR id = 1
    

    您将获得 1 行,带有 id = 1 的行。

    NULLmissingunknown 的别名,不能使用在可以使用1'something' 等有效值的地方。

    【讨论】:

    • VALUE=NULL 计算结果为 UNKNOWN - 而不是 FALSE。如果它是false,那么否定它会产生true
    • @MartinSmith 如果它是假的,那么否定它就会产生真 不,它不会。否定将导致NOT NULL 这也是NULL
    • 否定它会导致NOT UNKNOWN 导致UNKNOWN。 SQL 使用三个值逻辑falsetrueunknown。未知不等于假。您的答案中对 false 的引用是错误的。
    • @MartinSmith 当我说 finally false 我的意思是当你在 WHERE 子句中使用它时,它最终被视为false
    • 否,因为该谓词的计算结果为unknown - 并且where 子句过滤掉除谓词计算结果为true 的行之外的所有行。不会返回谓词计算结果为 falseunknown 的行。
    【解决方案3】:

    在 SQL Server 上下文中,NULL = NULL 仅在以下两种情况下为真:

    • 使用集合运算符时(EXECEPT、INTERSECT、UNION、UNION ALL)
    • 检查唯一约束中的值时

    在所有其他情况下,NULL = NULL 为假。

    这就是原因,当操作两个结果集时使用SET 运算符是安全的,以及为什么我们只允许在唯一约束中具有一个NULL 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-09
      • 2014-08-03
      • 2017-03-13
      • 1970-01-01
      • 2012-11-19
      • 2020-01-08
      • 2016-11-01
      • 1970-01-01
      相关资源
      最近更新 更多