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

Chr*_*ris 0 sql sql-server-2008

Some_Column (Table ABC)
___
123    
456    
NULL   
789
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM ABC WHERE Some_Column <> ''

它返回所有值,但返回null.无论ANSI_NULLS是打开还是关闭.

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

Bac*_*its 5

这是设计的.来自doc(强调我的):

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

因此,WHERE Some_Column <> ''返回所有不是''和不是NULL的行.

此查询使用ANSI_NULLS OFF:

SELECT * 
FROM ABC 
WHERE Some_Column <> '';
Run Code Online (Sandbox Code Playgroud)

相当于这个查询:

SELECT * 
FROM ABC 
WHERE Some_Column <> ''
    AND Some_Column IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

当ANSI_NULLS为ON时,当然正常的ANSI 三值逻辑适用.NULL永远不会等于任何东西,包括NULL.NULL也从来等于任何东西,包括NULL.

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

SELECT * 
FROM ABC 
WHERE Some_Column <> ''
    OR Some_Column IS NULL
Run Code Online (Sandbox Code Playgroud)