【发布时间】: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
我继续编写 SQL Server 中值为 null 的 select 语句为
SELECT *
FROM TABLE_1
WHERE VALUE = NULL
不正确
而不是
SELECT *
FROM TABLE_1
WHERE VALUE IS NULL
是什么原因IS在值为null时用于检查值,而=在值为整数或字符串时使用?
【问题讨论】:
标签: sql-server tsql
原因是NULL不是价值,而是缺乏价值。 ANSI 标准规定检查 NULL = NULL 和 NULL <> 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 的下一个版本中启用。
因为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 的行。NULL 是 missing 或 unknown 的别名,不能使用在可以使用1 或'something' 等有效值的地方。
【讨论】:
VALUE=NULL 计算结果为 UNKNOWN - 而不是 FALSE。如果它是false,那么否定它会产生true
NOT NULL 这也是NULL。
NOT UNKNOWN 导致UNKNOWN。 SQL 使用三个值逻辑false、true 和unknown。未知不等于假。您的答案中对 false 的引用是错误的。
false。
unknown - 并且where 子句过滤掉除谓词计算结果为true 的行之外的所有行。不会返回谓词计算结果为 false 或 unknown 的行。
在 SQL Server 上下文中,NULL = NULL 仅在以下两种情况下为真:
在所有其他情况下,NULL = NULL 为假。
这就是原因,当操作两个结果集时使用SET 运算符是安全的,以及为什么我们只允许在唯一约束中具有一个NULL 值。
【讨论】: