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是打开还是关闭.
任何人都可以向我解释这种奇特的行为吗?
这是设计的.来自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 NULL或Some_Column IS NULL显式处理NULL值.
SELECT *
FROM ABC
WHERE Some_Column <> ''
OR Some_Column IS NULL
Run Code Online (Sandbox Code Playgroud)