【问题标题】:Execution of CASE statement in SQL querySQL查询中CASE语句的执行
【发布时间】:2017-03-28 14:49:45
【问题描述】:

假设我们有一个名为“neighbors”的表,其中包含变量“name”,并且正在选择 name 并使用 CASE 语句将值分配给第二个变量“age”。可用于 SQL 中 CASE 语句的语法有两种不同的形式:

1) 简单的 CASE 表达式:

    CASE name   
        WHEN 'George' THEN 36   
        WHEN 'Alfred' THEN 40
        ELSE null   
    END as age

2) 搜索到的 CASE 表达式:

    CASE  
        WHEN name = 'George' THEN 36   
        WHEN name = 'Alfred' THEN 40
        ELSE null    
    END as age

这两个语句在做同样的事情。我的问题是,这些语句是如何在内存中处理的?它们的处理方式是否相同,或者可能一个比另一个更有效?

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql

【问题讨论】:

  • 两个 CASE 表达式都不是有效的 T-SQL
  • 我根据@JohnHC 更正编辑了语法。问题是成立的。

标签: sql case processing-efficiency


【解决方案1】:

正确的语法是

CASE name   
    WHEN 'George' THEN 36   
    WHEN 'Alfred' THEN 40
    ELSE null   
END  as age

CASE 
    WHEN name = 'George' THEN 36   
    WHEN name = 'Alfred' THEN 40
    ELSE null   
END  as age

后者的好处是它允许评估多个列:

CASE 
    WHEN name = 'George' and OtherColumn = 'Stuff' THEN 36   
    WHEN 'Alfred' THEN 40
    ELSE null   
END  as age

【讨论】:

  • 我编辑了我的原始帖子以使用您提供的正确语法。但是,我的问题仍然存在。
  • @silent_spec 在这样的简单案例中,性能方面没有区别。阅读here 了解更复杂的场景
  • 搜索到的 case 表达式是否将 'name' 读入内存两次,而简单的 case 表达式只读取一次?如果“名称”很大,则性能可能会有所不同,具体取决于将列读入内存的方式/时间。这就是我要弄清楚的..
  • @silent_spec 理论上,每行都会根据每个条件进行评估,直到满足条件。在您的基本示例中,此过程完全没有区别。在更复杂的示例中,需要考虑的内容更多。
【解决方案2】:

不确定内存中的表示或性能,但第二种方法可以评估多个条件,例如

case 
  when condition1 and (condition2 or condition3) then blah
  else blah blah
end

【讨论】: