SET ANSI_NULL行为

时间:2013-05-15 07:17:35

标签: sql-server

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不返回任何结果?

1 个答案:

答案 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);

第二个查询将返回结果。

SQL Fiddle DEMO

  

当SET ANSI_NULLS为ON时,所有与空值的比较   评估为UNKNOWN。当SET ANSI_NULLS为OFF时,对所有进行比较   如果数据值为NULL,则空值的数据计算结果为TRUE。

修改

如@Damien_The_Unveliever所述

来自IN (Transact-SQL)

  

要比较的子查询或表达式返回的任何空值   使用IN或NOT IN返回UNKNOWN到test_expression。使用null   值与IN或NOT IN一起会产生意外结果。