J. *_*ini 4 sql t-sql sql-server case
我想写以下内容
CASE [FOO]
WHEN 1 THEN 'YES'
WHEN 0 THEN 'NO'
WHEN NULL THEN 'NO'
END
Run Code Online (Sandbox Code Playgroud)
我当然可以写
CASE
WHEN [FOO] = 1 THEN 'YES'
WHEN [FOO] = 0 OR FOO IS NULL THEN 'NO'
END
Run Code Online (Sandbox Code Playgroud)
反而。
除了风格之外,是否有任何理由(例如性能)更喜欢其中一种?
没有性能原因。
你可能会期望
SELECT CASE ( scalar_subquery )
WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
END
Run Code Online (Sandbox Code Playgroud)
可能有一个优势,并且只评估子查询一次,因为它只在文本中出现一次。但这种情况并非如此。
不过,这里有一个很好的语义理由让您使用“搜索”语法。“简单”CASE表达式只是测试相等性的简写方式 ( =) - 不是IS。
所以除非你正在运行SET ANSI_NULLS OFF(而且您不应该这样做!),否则这将不会如您所愿。
如果您查看第一个语句的执行计划,您会发现它无论如何都会扩展到嵌套的“搜索”表达式(并在ANSI_NULLSis时优化冗余分支ON)
CASE
WHEN [FOO] = ( 1 ) THEN 'YES'
ELSE
CASE
WHEN [FOO] = ( 0 ) THEN 'NO'
ELSE NULL
END
END
Run Code Online (Sandbox Code Playgroud)
它什么时候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
Run Code Online (Sandbox Code Playgroud)
您的第二个在计划中显示为
CASE
WHEN [FOO] = ( 1 ) THEN 'YES'
ELSE
CASE
WHEN [FOO] = ( 0 ) OR [FOO] IS NULL THEN 'NO'
ELSE NULL
END
END
Run Code Online (Sandbox Code Playgroud)
即使您确实有严格的=要求,因此“嵌套”扩展有时也会导致链接服务器出现问题,因此当您有多种情况导致相同的情况时,将result_expression它们组合在一起Boolean_expression(OR使用“搜索”形式)可能是有益的减少嵌套的级别。
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |