Sql server 在子句中,TSQL/SQL Server中的NULL处理?

Sql server 在子句中,TSQL/SQL Server中的NULL处理?,sql-server,tsql,sql-server-2008,exists,Sql Server,Tsql,Sql Server 2008,Exists,假设有这样一张表: f1 f2 ---------- 1 3 4 8 6 4 NULL 1 以下查询按预期工作: SELECT f2 FROM Table_1 a WHERE NOT EXISTS (SELECT * FROM Table_1 WHERE a.f2 = f1) …结果集为: f2 --- 3 8 …但类似的查询与中的不返回任何内容:

假设有这样一张表:

f1      f2
----------
1       3
4       8
6       4
NULL    1
以下查询按预期工作:

SELECT f2
  FROM Table_1 a
 WHERE NOT EXISTS (SELECT *
                     FROM Table_1 
                    WHERE a.f2 = f1)
…结果集为:

f2
---
3
8
…但类似的查询与中的
不返回任何内容:

SELECT f2
  FROM Table_1 a
 WHERE f2 NOT IN (SELECT b.f1 
                    FROM Table_1 b)

有什么问题吗

这是因为f1中的
null
值。试试这个

SELECT      f2
FROM         Table_1 a
WHERE f2 NOT IN (select b.f1 
                 from Table_1 b
                 where b.f1 is not null)

这里有一个很好的解释来解释为什么会这样

几年前的类似问题。三态逻辑的常见问题。顺便说一句,“tbltemp”是我的错。它应该被替换为“Table_1”。在第一次查询中,最里面的选择与
Table_1
不符,在第二次查询中与
tbltemp b
不符-只是一个输入错误??是的,marc\s抱歉。我犯了一个错误