2012-07-26 37 views
3

我很好奇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。这是我可以信赖的吗?

回答

4

你不能比较NULL与任何其它值将导致'UNKNOWN'

msdn source

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

0

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 
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的比较在列A 包含空值时返回TRUE,而在列A包含除NULL之外的某些值 时返回FALSE。

0

以下=中的WHERE子句也是FALSE。你需要非常小心的NULLs

WITH ctx AS 
(
SELECT 123 AS n0, NULL AS n1 
) 
SELECT * 
FROM ctx 
WHERE ctx.n1 = NULL