我希望写下以下内容

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 

可能具有优势,并且只对子查询求值一次,因为它只在文本中出现一次.但事实并非如此.

enter image description here

不过,在这里使用"已搜索"语法是有很好的语义原因的."简单的"CASE表达式只是测试相等(=)的一种简单方法,而不是IS.

因此,除非你运行的是SET ANSI_NULLS OFF(你不应该是这样的!),否则它不会像你所希望的那样工作.

如果您查看第一条语句的执行计划,您会发现它无论如何都会扩展为嵌套的"搜索"表达式(并在ANSI_NULLSON时优化出冗余分支)

  CASE
     WHEN [FOO] = ( 1 ) THEN 'YES'
     ELSE
       CASE
         WHEN [FOO] = ( 0 ) THEN 'NO'
         ELSE NULL
       END
   END 

ANSI_NULLSOFF时,它在平面中显示为

  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中(使用"已搜索"形式)在减少嵌套级别方面也是有益的.

Sql相关问答推荐

GROUP BY与多个嵌套查询T—SQL

Postgres JSONB对象筛选

BigQuery`喜欢ANY‘和`不喜欢ANY’

更新在两个或多个面中具有交点的面

替换条件中的单元格值

在Oracle SQL中将列值转换为行

如何计算一个用户S的日常连胜?

Oracle 23c ROUND,数据类型为DATE

仅在日期相隔时递增(Oracle SQL)

在SELECT中将日期格式转换为双周时段

PostgreSQL-按距离阈值挤压相邻行的性能

如何使用聚合连接两个表

汇总具有连续日期范围的行

按公司和产品查询最近发票的平均价格的SQL查询

如何优化仅返回符合条件的三条记录的查询?

使用对 nvarchar 列的多个 LIKE 操作优化 SQL 查询

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

获取 SQL Server 中每一行的两个-之间的文本

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

如何根据 ID 和指标从 2 个表中找到不同的值?