2011-08-28 29 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對你的迴應 –