我想了解哪种是在存储过程中实现“IF”条件的更好方法。
我已经看到这种方法被广泛使用。这与迭代编码相当......
declare @boolExpression bit = 1 --True
if @boolExpression = 1
select column from MyTable where group = 10
else
select column from MyTable where group = 20
我更喜欢使用基于集合的方法......
declare @boolExpression bit = 1 --True
select column from MyTable where group = 10 and @boolExpression =1
union all
select column from MYTable where group = 20 and @boolExpression =0
我更喜欢使用此方法,因为据我所知,它创建了一个可重用的查询计划,减少了计划缓存的流失。是这个事实还是虚构?这是正确的使用方法。
提前致谢
答案 0 :(得分:4)
假设您错过了UNION ALL
据我所见,其中没有多少内容。第一个版本将每个语句的计划缓存为COND
运算符的子级,以便在执行时仅调用相关的一个。
第二个将分支作为连接运算符的子节点。过滤器具有启动表达式谓词,这意味着只有在需要时才会评估每个搜索。
答案 1 :(得分:0)
你也可以按如下方式使用它:
DECLARE @boolExpression BIT = 1
SELECT column FROM MyTable
WHERE
CASE
WHEN @boolExpression = 1 THEN
CASE
WHEN group = 10 THEN 1
ELSE 0
END
ELSE
CASE
WHEN group = 20 THEN 1
ELSE 0
END
END = 1
我知道它看起来很复杂但是很有用,特别是在存储过程中应用参数是可选的情况下。