我很好奇t-SQL中是否合法将NULL与值进行比较?将t-SQL中的值与NULL比较
举例来说,如果我有:
WITH ctx AS(SELECT 123 AS n0, NULL AS n1)
SELECT n0 FROM ctx
WHERE ctx.n1 < 130
在这种情况下,WHERE子句总是被评估为FALSE。这是我可以信赖的吗?
我很好奇t-SQL中是否合法将NULL与值进行比较?将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'
。
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;它产生 UNKNOWN。
Transact-SQL支持允许比较 运算符时比较空值时返回TRUE或FALSE的扩展名。 该选项通过设置ANSI_NULLS OFF来激活。当ANSI_NULLS是 OFF时,如ColumnA = NULL的比较在列A 包含空值时返回TRUE,而在列A包含除NULL之外的某些值 时返回FALSE。
以下=
中的WHERE子句也是FALSE。你需要非常小心的NULLs
WITH ctx AS
(
SELECT 123 AS n0, NULL AS n1
)
SELECT *
FROM ctx
WHERE ctx.n1 = NULL