我在我的SQL存储过程
中使用此模式作为可选的过滤器参数 AND (
@OptionalParam IS NULL OR
(
Id = @OptionalParam
)
)
但是,OR不是查询优化器的朋友。有没有使用动态SQL
的更有效方法答案 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
他们在一起。根据您的数据拓扑,这可能会产生更好的结果。它也可能更糟糕。