2011-08-28 45 views
4

假设有这样一个表:IN子句,TSQL/SQL Server中的NULL处理?

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 

...但与IN相似的查询不会返回任何内容:

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

有什么问题?

+0

最内层的SELECT在第一个查询中违背了“Table_1”,而在第二个查询中违反了“tbltemp b” - 只是一个错字? –

+0

是的marc_s 对不起。我犯了一个错误 –

回答

10

这是因为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) 

这是一个很好的解释,为什么它是如此。 NOT IN clause and NULL values

+0

几年前的类似问题。三态逻辑的常见问题。 http://stackoverflow.com/questions/129077/sql-not-in-constraint-and-null-values – RonnieDickson

+1

[由乔Celko在这里更详细的解释](http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-valued -value-logic /) –

+0

非常感谢Mikael对你的回应 –