2011-10-21 30 views
0

我對兩個SQL查詢的結果感到困惑。把桌上的內容和兩個查詢:在涉及「空」的SQL查詢中感到困惑沒有選擇行返回

​​

a) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg');

的(a)所示的所有4行

b) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg') and NOT (STATUS = 'PENDING')

結果,而結果(b)所示什麼!

列'狀態'可以具有「PENDING」以外的值,並且爲了報告原因,我不能使用'STATUS IS NOT NULL'作爲過濾器。我不明白爲什麼查詢(b)什麼都不返回。在此先感謝您的幫助

平臺:MSSQL 2008

回答

2

SQL使用三個值邏輯(TrueFalseUnknown)。 WHERE子句需要評估爲True要返回的行。

STATUS = 'PENDING'返回UNKNOWNStatus IS NULL

如果您否定Unknown,您仍然會得到Unknown

SQL and the Snare of Three-Valued Logic

你需要重寫查詢作爲

SELECT Col1, STATUS 
FROM TABLE_A 
WHERE KEY IN ('abcd','defg') and (STATUS IS NULL OR STATUS <> 'PENDING') 

(雖然它可能使用已棄用ANSI_NULLS session選項得到你想要的行爲)

+0

+1,但因爲OP由於某種原因似乎無法使用'STATUS IS NOT NULL',所以你可以將條件改爲'AND NOT ISNULL(STATUS,'')='PENDING'' –

+0

@Lieven - 米不知道爲什麼OP已添加restri進入問題。如果他們根本不能改變查詢,那麼他們可以查看'ANSI_NULLS'。 –

+0

他們可以...但我不想保持它:) –