SET ANSI_NULLS ON;
-- Query1
SELECT 'StackOverFlow' AS Statement11
WHERE 'Name' IN ('S','Q', 'L', 'Name', NULL);
-- Query 2
SELECT 'StackOverFlow' AS Statement12
WHERE 'Name' NOT IN ('S','Q', 'L', NULL);
为什么查询1返回结果但查询2不返回任何结果?
答案 0 :(得分:3)
来自SET ANSI_NULLS (Transact-SQL)
当SET ANSI_NULLS为ON时,使用WHERE的SELECT语句 column_name = NULL即使存在空值,也返回零行 列名。使用WHERE column_name<>的SELECT语句空值 即使column_name中存在非空值,也会返回零行。
现在,如果您要使用
SET ANSI_NULLS OFF;
-- Query1
SELECT 'StackOverFlow' AS Statement11
WHERE 'Name' IN ('S','Q', 'L', 'Authority', NULL);
-- Query 2
SELECT 'StackOverFlow' AS Statement12
WHERE 'Name' NOT IN ('S','Q', 'L', NULL);
第二个查询将返回结果。
当SET ANSI_NULLS为ON时,所有与空值的比较 评估为UNKNOWN。当SET ANSI_NULLS为OFF时,对所有进行比较 如果数据值为NULL,则空值的数据计算结果为TRUE。
修改强>
如@Damien_The_Unveliever所述
要比较的子查询或表达式返回的任何空值 使用IN或NOT IN返回UNKNOWN到test_expression。使用null 值与IN或NOT IN一起会产生意外结果。