2015-12-14 47 views
2

SQL服務器上的工作,我是想指望根據某些條件的總行數,如圖波紋管的簡單查詢:SQL服務器上,運營商表現出不同的結果

SELECT count(*) FROM my_table WHERE (supp=92 OR (supp=94 and organisation <> 'LDF')) 

知道MY_TABLE不包含任何行與supp=92organisation='LDF'我決定把查詢簡單的像下面這樣:

SELECT count(*) FROM my_table WHERE supp IN (92,94) and organisation <> 'LDF' 

兩個查詢的結果是完全不同的。

然而,查詢看起來完全一樣,我一直在試圖找出問題出在哪裏,但我找不到答案。

這真的讓我感到困惑,先謝謝你的回答。

+1

考慮一個行,其中supp = 92 AND organization ='LDF'。它包含在第一個查詢中,但從第二個查詢中排除。 –

+1

也考慮一個行,其中supp = 92 AND organization IS NULL。它將包含在第一個查詢中,但從第二個查詢中排除。 – AHiggins

+0

謝謝你的回答,但是在supp_92和organization ='LDF'的行不存在於my_table上,這就是爲什麼這真是令人困惑 – PaxBin

回答

2

如果您organisation列包含的任何NULL值,其中supp=92,第一個查詢將返回他們但第二個查詢將排除他們。這是因爲此代碼:

organisation <> 'LDF' 

如果組織字段爲NULL,將返回'NULL',而不是'TRUE'。

我建議你閱讀羅伯特謝爾登關於NULL可以讓你感動的所有方法的優秀文章;整篇文章值得一讀,但the ninth point談論這個特定的情況。

+0

就是這樣,謝謝,我不知道運算符<>排除空值 – PaxBin

+0

樂意幫忙!我已經更新了我的答案,並附有一篇很好的文章鏈接,深入探討了這個主題。 – AHiggins

0

他們是不一樣的

第一:

SELECT COUNT(*) 
FROM my_table 
WHERE supp=92 
    OR (supp=94 AND organisation <> 'LDF') 

二是等價於:

SELECT COUNT(*) 
FROM my_table 
WHERE (supp = 92 OR supp = 94) 
    AND organisation <> 'LDF'