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 不返回任何结果?
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 不返回任何结果?
从SET ANSI_NULLS (Transact-SQL)
当 SET ANSI_NULLS 为 ON 时,即使 column_name 中有空值,使用 WHERE column_name = NULL 的 SELECT 语句也会返回零行。即使 column_name 中有非空值,使用 WHERE column_name <> NULL 的 SELECT 语句也会返回零行。
现在,如果你要使用
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 与 test_expression 进行比较的子查询或表达式返回的任何空值都返回 UNKNOWN。将空值与 IN 或 NOT IN 一起使用可能会产生意想不到的结果。