6

我很好奇在 t-SQL 中将 NULL 与值进行比较是否合法?

例如,如果我有:

WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE ctx.n1 < 130

在这种情况下,WHERE 子句总是被评估为 FALSE。这是我可以依靠的东西吗?

4

5 回答 5

6

您不能将 NULL 与任何其他值进行比较,它将导致'UNKNOWN'.

来自msdn 源码

NULL 值表示该值未知。NULL 值不同于空值或零值。没有两个空值是相等的。两个空值之间或 NULL 与任何其他值之间的比较返回未知,因为每个 NULL 的值都是未知的。

于 2012-07-26T05:10:16.947 回答
3

T-Sql 中所有具有 null 值的布尔运算都返回“UNKNOWN”,在子句中被识别为 false。当你想设置一些默认值时,你可以使用 ISNULL 函数。例如在你的情况下:

WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE isnull(ctx.n1,0) < 130
于 2012-07-26T05:10:11.447 回答
2

它取决于 ANSI_NULLS 的值。

http://msdn.microsoft.com/en-us/library/ms191270%28v=sql.90%29.aspx

当 SET ANSI_NULLS 为 ON 时,一个或多个表达式为 NULL 的比较不会产生 TRUE 或 FALSE;它产生未知。

Transact-SQL 支持允许比较运算符在与空值进行比较时返回 TRUE 或 FALSE 的扩展。此选项通过设置 ANSI_NULLS OFF 来激活。当 ANSI_NULLS 为 OFF 时,当 ColumnA 包含空值时,如 ColumnA = NULL 之类的比较返回 TRUE,而当 ColumnA 包含除 NULL 之外的某个值时,则返回 FALSE。

于 2012-07-26T05:11:09.083 回答
0

下面的 WHERE 子句=也是 FALSE。您需要非常小心 NULL

WITH ctx AS
(
SELECT 123 AS n0, NULL AS n1
) 
SELECT *
FROM ctx 
WHERE ctx.n1 = NULL
于 2012-07-26T10:42:42.557 回答
0

我一直像这样使用 EXISTS 关键字和 EXCEPT

SELECT 1
WHERE EXISTS ((SELECT 1) EXCEPT (SELECT NULL))
于 2020-04-09T23:20:49.557 回答