我希望写下以下内容
CASE [FOO]
WHEN 1 THEN 'YES'
WHEN 0 THEN 'NO'
WHEN NULL THEN 'NO'
END
当然,我可以写
CASE
WHEN [FOO] = 1 THEN 'YES'
WHEN [FOO] = 0 OR FOO IS NULL THEN 'NO'
END
取而代之的是.
撇开风格不谈,有没有什么理由(例如性能)更喜欢其中之一?
我希望写下以下内容
CASE [FOO]
WHEN 1 THEN 'YES'
WHEN 0 THEN 'NO'
WHEN NULL THEN 'NO'
END
当然,我可以写
CASE
WHEN [FOO] = 1 THEN 'YES'
WHEN [FOO] = 0 OR FOO IS NULL THEN 'NO'
END
取而代之的是.
撇开风格不谈,有没有什么理由(例如性能)更喜欢其中之一?
没有性能方面的原因.
你可能会预料到
SELECT CASE ( scalar_subquery )
WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
END
可能具有优势,并且只对子查询求值一次,因为它只在文本中出现一次.但事实并非如此.
不过,在这里使用"已搜索"语法是有很好的语义原因的."简单的"CASE
表达式只是测试相等(=
)的一种简单方法,而不是IS
.
因此,除非你运行的是SET ANSI_NULLS OFF
(你不应该是这样的!),否则它不会像你所希望的那样工作.
如果您查看第一条语句的执行计划,您会发现它无论如何都会扩展为嵌套的"搜索"表达式(并在ANSI_NULLS
为ON
时优化出冗余分支)
CASE
WHEN [FOO] = ( 1 ) THEN 'YES'
ELSE
CASE
WHEN [FOO] = ( 0 ) THEN 'NO'
ELSE NULL
END
END
当ANSI_NULLS
是OFF
时,它在平面中显示为
CASE
WHEN [FOO] = ( 1 ) THEN 'YES'
ELSE
CASE
WHEN [FOO] = ( 0 ) THEN 'NO'
ELSE
CASE
WHEN [FOO] IS NULL THEN 'NO'
ELSE NULL
END
END
END
您的第二个项目在计划中显示为
CASE
WHEN [FOO] = ( 1 ) THEN 'YES'
ELSE
CASE
WHEN [FOO] = ( 0 ) OR [FOO] IS NULL THEN 'NO'
ELSE NULL
END
END
即使您确实只有严格的=
要求,因此任何一个都可以工作,所以当您有多个 case 导致相同的result_expression
时,"嵌套"扩展偶尔可以达到cause problems with linked servers,因此,将这些条件与OR
组合在相同的Boolean_expression
中(使用"已搜索"形式)在减少嵌套级别方面也是有益的.