即使在设置ANSI_NULLS时,与NULL行为的比较也相同

时间:2015-07-14 20:10:14

标签: sql sql-server-2008

Some_Column (Table ABC)
___
123    
456    
NULL   
789

当我运行SELECT * FROM ABC时,它会返回所有行。 但是,当我跑

SELECT * FROM ABC WHERE Some_Column <> ''

它返回所有值,但返回null。是否ANSI_NULLS开启或关闭。

任何人都可以向我解释这种奇特的行为吗?

2 个答案:

答案 0 :(得分:5)

它的设计。来自the doc(强调我的):

  

当SET ANSI_NULLS为OFF时,Equals(=)和Not Equal To(&lt;&gt;)比较运算符不遵循ISO标准。使用WHERE column_name = NULL的SELECT语句将返回column_name中具有空值的行。使用WHERE column_name&lt;&gt;的SELECT语句NULL返回列中具有非空值的行。此外,使用WHERE column_name&lt;&gt;的SELECT语句XYZ_value返回非XYZ_value且不为NULL的所有行。

因此,WHERE Some_Column <> ''返回非''且不为NULL的所有行。

此查询使用ANSI_NULLS OFF:

SELECT * 
FROM ABC 
WHERE Some_Column <> '';

等同于此查询:

SELECT * 
FROM ABC 
WHERE Some_Column <> ''
    AND Some_Column IS NOT NULL;

当ANSI_NULLS为ON时,当然正常的ANSI Three Valued Logic适用。 NULL永远不会等于任何东西,包括NULL。 NULL也永远不会等于任何东西,包括NULL。

无论哪种方式,您都应该使用Some_Column IS NOT NULLSome_Column IS NULL并显式处理NULL值。

SELECT * 
FROM ABC 
WHERE Some_Column <> ''
    OR Some_Column IS NULL

答案 1 :(得分:3)

这是因为NULL既不等于也不等于&#39; ... NULL只是没有值。你可以声称它是“未知的”。

在返回查询时包含NULL的唯一方法是添加一个子句来检查空值: -

SELECT * FROM ABC WHERE Some_Column <> '' OR Some_Column IS NOT NULL

ANSI_NULLS不会改变此行为。它只允许你直接比较null作为一个值'&#39; e.g。

WHERE Some_Column = NULL

而不是

WHERE Some_Column IS NULL