我用這個模式可選的過濾器PARAMATERS在我的SQL存儲過程替代NULL檢查,然後或可選PARAMATERS
AND (
@OptionalParam IS NULL OR
(
Id = @OptionalParam
)
)
然而,或者不是查詢優化器的一個朋友。有沒有更有效的方式來做到這一點,而不使用動態SQL
我用這個模式可選的過濾器PARAMATERS在我的SQL存儲過程替代NULL檢查,然後或可選PARAMATERS
AND (
@OptionalParam IS NULL OR
(
Id = @OptionalParam
)
)
然而,或者不是查詢優化器的一個朋友。有沒有更有效的方式來做到這一點,而不使用動態SQL
你可以嘗試使用COALESCE。不知道它是否會更有效率。
AND Id = Coalesce(@OptionalParam, Id)
如果Id本身爲null並且您使用的是ANSI空值,則這不起作用。
你可以嘗試:
AND Id = CASE WHEN @OptionalParam IS NULL THEN Id ELSE NULL END
我懷疑這將優化得多,但是它沒有OR
。
或者,您可以將您的查詢拆分爲兩個組件 - 一個只用@OptionalParam IS NULL
測試,另一個用Id = @OptionalParam
測試,然後UNION
將它們放在一起。根據您的數據拓撲,這可能會產生更好的結果。它也可能會更糟糕。
AND ID = ISNULL(@OptionalParam, ID)
,或者你如果你有多個可選參數可以使用
AND ID = COALESCE(@OptionalParam1, @OptionalParam2, ID)
這是絕對比使用OR語句更快。
像其他回答者一樣,如果ID列爲空(但是原來的語句也不會),這將不起作用。
對於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