2011-02-17 64 views
6

我正在尋求在我的查詢中阻止非sargable表達式,這是檢查null條件的更好方法嗎?在TSQL中使用ISNULL的Sargable查詢

AND c.Account IS NOT NULL 
AND c.Account <> '' 

AND ISNULL(c.Account,'') <> '' 

我漸漸明白指出,AccountLEFT JOIN來得那麼它可以爲空。我想要他們只交叉的情況下,這意味着我應該只使用INNER JOIN吧?感謝facepalms;)

然而,忽視了肉麻的自我實現,我還是想知道在一般情況下,這個問題的答案,我不能讓Account NOT NULL列。

+2

最好將Account字段設置爲NOT NULL,因爲這些值對您來說意味着相同,並且最好使用COALESCE,因爲它是SQL標準的一部分。 – LukLed 2011-02-17 01:16:24

+2

空字符串等於NULL? Eeeeeek! – 2011-02-17 01:18:17

回答

2

C.Account <> ''相當於ISNULL(c.Account, '') <> ''

的SQL Server可能是足夠聰明的ISNULL轉換成等價的特區政府的表達,但如果您在使用功能彎曲,然後合併是一個更好的選擇,因爲它是SQL的一部分標準允許多個值(而不是IsNull中的兩個),並避免使用微軟在IsNull中設計的最令人困惑的函數名稱。

-2

COALESCE IS SARGABLE,因爲它只是一個快捷表達式(相當於使用CASE WHEN IS NOT NULL THEN ELSE ...)。

ISNULL是一個內置的功能,所以ISNULL不是優化搜索

2

只需使用WHERE c.Account <> ''

這並不等於true或者null或空字符串,並有可能使用範圍進行評估尋求Account

使用ISNULLCOALESCE將使表達式變得不可糾正並且不需要。

如果你想從完全由空格的字符串區分真正的空字符串,你可以使用

WHERE c.Account IS NOT NULL AND DATALENGTH(c.Account) > 0 

它結合了一個可優化搜索謂詞,允許索引查找跳過索引中的空白與unsargable一個反對剩下的值。