在t-SQL中将值与NULL进行比较

时间:2012-07-26 05:04:36

标签: sql sql-server tsql null

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

例如,如果我有:

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

在这种情况下,WHERE子句的计算结果始终为FALSE。这是我可以依赖的东西吗?

5 个答案:

答案 0 :(得分:4)

您无法将NULL与将导致'UNKNOWN'的任何其他值进行比较。

来自msdn source

  

值为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))