2010-02-25 41 views
7

當試圖計算沒有由select語句指定的varchar值的行數時,我遇到了一個奇怪的情況。好吧,這聽起來令我困惑,所以讓我舉個例子:COUNT()NOT IN子句中的函數與varchar字段無法正常工作(T-SQL)

假設我在「SomeTable」中有一個字段「MyField」,並且我想計算MyField值不屬於域由「SomeOtherTable」中的「MyOtherField」的值定義。 換句話說,假設我們有MyOtherField = {1,2,3},我想在多少行MyField的值不爲1,2或3.對於計數,我會使用以下查詢:

SELECT COUNT(*) FROM SomeTable 
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable)) 

它的功能就像一個魅力。但請注意,MyField和MyOtherField是int類型的。如果我嘗試運行完全相同的查詢,除了varchar類型的字段,它的返回值是0,即使我知道有錯誤的值,我把它們放在那裏!然而,如果我只是通過在上面的查詢中抑制「NOT」子句來計算相反的結果(域中有多少行與我想要的行相反,那麼多少行就不是這樣)......那麼,THAT作品! ¬¬

是的,必須有大量的解決方法,但我想知道爲什麼它不應該如此工作。此外,我不能簡單地修改整個查詢,因爲大部分查詢都是在C#代碼中構建的,基本上,我可以自由更改的唯一一部分不會影響軟件的其他任何部分,對應於域(無論是否在NOT IN子句中)。我希望我明確自己,有人可以幫助我。

在此先感謝。

+1

你有沒有空標記在「SomeOtherTable」對於那場? – 2010-02-25 20:48:50

回答

6

對於NOT IN,如果子查詢返回NULL值,則始終爲false。 this question的接受答案優雅地描述了原因。

列值的空性是獨立過使用的數據類型:最有可能你的VARCHAR列有NULL值

做處理這種情況,使用NOT EXISTS。對於非空值,它的工作原理一樣NOT IN等是兼容

SELECT COUNT(*) FROM SomeTable S1 
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField) 
+0

謝謝,使用你的建議查詢與NOT EXISTS子句做得很好,我想要的。 – 2010-02-25 20:55:44

0

GBN有一個更完整的答案,但我也懶得記住這一切。相反,我有過濾空的宗教習慣了我的條款:

SELECT COUNT(*) 
FROM SomeTable  
WHERE [MyField] NOT IN (
    SELECT MyOtherField FROM SomeOtherTable 
    WHERE MyOtherField is not null 
)