2011-12-13 36 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列为空(但是原来的语句也不会),这将不起作用。