IN子句,TSQL/SQL Server中的NULL处理?

Mos*_*ndi 4 t-sql sql-server exists sql-server-2008

假设有一个这样的表:

f1      f2
----------
1       3
4       8
6       4
NULL    1
Run Code Online (Sandbox Code Playgroud)

以下查询按预期工作:

SELECT f2
  FROM Table_1 a
 WHERE NOT EXISTS (SELECT *
                     FROM Table_1 
                    WHERE a.f2 = f1)
Run Code Online (Sandbox Code Playgroud)

...和结果集是:

f2
---
3
8
Run Code Online (Sandbox Code Playgroud)

...但类似的查询IN没有返回任何内容:

SELECT f2
  FROM Table_1 a
 WHERE f2 NOT IN (SELECT b.f1 
                    FROM Table_1 b)
Run Code Online (Sandbox Code Playgroud)

有什么问题 ?

Mik*_*son 10

这是因为nullf1 中的值.试试这个.

SELECT      f2
FROM         Table_1 a
WHERE f2 NOT IN (select b.f1 
                 from Table_1 b
                 where b.f1 is not null)
Run Code Online (Sandbox Code Playgroud)

这是一个很好的解释,为什么会这样.NOT IN子句和NULL值