我用这个模式可选的过滤器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