除了风格之外,还有什么理由更喜欢简单的“CASE WHEN”而不是搜索呢?

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)

反而。

除了风格之外,是否有任何理由(例如性能)更喜欢其中一种?

Mar*_*ith 5

没有性能原因。

你可能会期望

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_expressionOR使用“搜索”形式)可能是有益的减少嵌套的级别。