2011-12-13 35 views
1

我用這個模式可選的過濾器PARAMATERS在我的SQL存儲過程替代NULL檢查,然後或可選PARAMATERS

  AND (
       @OptionalParam IS NULL OR 
       (
        Id = @OptionalParam 
       ) 
      ) 

然而,或者不是查詢優化器的一個朋友。有沒有更有效的方式來做到這一點,而不使用動態SQL

+1

對於2005,請查看:[SQL 2005和更早版本的T-SQL 版本中的動態搜索條件](http://www.sommarskog.se/dyn-search-2005.html)。對於2008年,請查看:[SQL 2008的T-SQL 版本中的動態搜索條件](http://www.sommarskog.se/dyn-search-2008.html) – 2011-12-13 19:54:26

回答

1

你可以嘗試使用COALESCE。不知道它是否會更有效率。

AND Id = Coalesce(@OptionalParam, Id) 

如果Id本身爲null並且您使用的是ANSI空值,則這不起作用。

0

你可以嘗試:

AND Id = CASE WHEN @OptionalParam IS NULL THEN Id ELSE NULL END 

我懷疑這將優化得多,但是它沒有OR

或者,您可以將您的查詢拆分爲兩個組件 - 一個只用@OptionalParam IS NULL測試,另一個用Id = @OptionalParam測試,然後UNION將它們放在一起。根據您的數據拓撲,這可能會產生更好的結果。它也可能會更糟糕。

1
AND ID = ISNULL(@OptionalParam, ID) 

,或者你如果你有多個可選參數可以使用

AND ID = COALESCE(@OptionalParam1, @OptionalParam2, ID) 

這是絕對比使用OR語句更快。

像其他回答者一樣,如果ID列爲空(但是原來的語句也不會),這將不起作用。