我很好奇在 t-SQL 中将 NULL 与值进行比较是否合法?
例如,如果我有:
WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE ctx.n1 < 130
在这种情况下,WHERE 子句总是被评估为 FALSE。这是我可以依靠的吗?
不能将 NULL 与任何其他值进行比较,这会导致
'UNKNOWN'
。
来自msdn来源
NULL 值表示该值未知。值为 NULL 与空值或零值不同。没有两个空值 平等的。两个空值之间或 NULL 与任何值之间的比较 其他值,返回未知,因为每个 NULL 的值都是未知的。
T-Sql 中所有值为空的布尔运算都会返回“UNKNOWN”,在子句中会被识别为 false。当你想设置一些默认值时,可以使用 ISNULL 函数。 例如你的情况:
WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE isnull(ctx.n1,0) < 130
这取决于 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 = NULL 等比较时返回 TRUE 当 ColumnA 包含某个值时包含 null 值和 FALSE 除了 NULL 之外。
下面
=
中的WHERE子句也是FALSE。你需要非常小心 NULL
WITH ctx AS
(
SELECT 123 AS n0, NULL AS n1
)
SELECT *
FROM ctx
WHERE ctx.n1 = NULL
我一直使用 EXISTS 关键字和 EXCEPT 像这样
SELECT 1
WHERE EXISTS ((SELECT 1) EXCEPT (SELECT NULL))