替代NULL检查,然后OR用于可选参数

时间:2011-12-13 19:50:49

标签: sql sql-server-2005 sql-server-2008 tsql

我在我的SQL存储过程

中使用此模式作为可选的过滤器参数
            AND  (
                @OptionalParam IS NULL OR
                (
                    Id = @OptionalParam
                )
            )

但是,OR不是查询优化器的朋友。有没有使用动态SQL

的更有效方法

3 个答案:

答案 0 :(得分:1)

您可以尝试使用COALESCE。不确定它是否会更有效率。

AND Id = Coalesce(@OptionalParam, Id)

如果Id本身为null并且您使用的是ANSI null,则无效。

答案 1 :(得分:1)

AND ID = ISNULL(@OptionalParam, ID)

或者如果你有多个可选参数可以使用

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

这肯定比使用OR语句更快。

与提到的其他回答者一样,如果ID列为空,则无效(但是,原始语句也不会)。

答案 2 :(得分:0)

你可以尝试:

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

我怀疑这会更好地优化,但其中没有OR

或者,您可以将查询拆分为两个组件 - 一个只有@OptionalParam IS NULL个测试,另一个只有Id = @OptionalParam测试,然后UNION他们在一起。根据您的数据拓扑,这可能会产生更好的结果。它也可能更糟糕。

相关问题