我很好奇是否在t-SQL中将NULL与值进行比较是合法的?
例如,如果我有:
WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE ctx.n1 < 130
在这种情况下,WHERE子句的计算结果始终为FALSE。这是我可以依赖的东西吗?
答案 0 :(得分:4)
您无法将NULL与将导致'UNKNOWN'
的任何其他值进行比较。
值为NULL表示该值未知。值为NULL 不同于空值或零值。没有两个空值 等于。两个空值之间或NULL与任意之间的比较 其他值,返回未知因为每个NULL的值未知。
答案 1 :(得分:2)
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
答案 2 :(得分:2)
取决于ANSI_NULLS的值。
http://msdn.microsoft.com/en-us/library/ms191270%28v=sql.90%29.aspx
当SET ANSI_NULLS为ON时,进行比较,其中一个或多个 表达式为NULL不会产生TRUE或FALSE;它产生了 UNKNOWN。
Transact-SQL支持允许比较的扩展 运算符在与空值进行比较时返回TRUE或FALSE。 通过将ANSI_NULLS设置为OFF来激活此选项。当ANSI_NULLS是 OFF,ColumnA = NULL之类的比较在ColumnA时返回TRUE 当ColumnA包含某个值时,包含空值和FALSE 除了NULL。
答案 3 :(得分:0)
以下=
中的WHERE子句也为FALSE。您需要非常小心使用NULL
WITH ctx AS
(
SELECT 123 AS n0, NULL AS n1
)
SELECT *
FROM ctx
WHERE ctx.n1 = NULL
答案 4 :(得分:0)
我一直像这样使用EXISTS关键字和EXCEPT
SELECT 1
WHERE EXISTS ((SELECT 1) EXCEPT (SELECT NULL))