CASE语句SQL:案例中的优先级?

时间:2014-03-29 16:35:15

标签: sql-server tsql

我在SQL(Server 2008)中使用CASE语句时遇到一般性问题,并且您的WHEN条件中有多个为真,但结果标志不同。

这是一个假设的示例,但在跨多列应用检查以对行中的数据进行分类时可以转换。下面代码的输出取决于案例的排序方式,因为两者都是真的。

DECLARE @TESTSTRING varchar(5)
SET @TESTSTRING = 'hello'

SELECT CASE 
WHEN @TESTSTRING = 'hello' THEN '0'
WHEN @TESTSTRING <> 'hi' THEN '1'
ELSE 'N/A' 
END AS [Output]

一般来说,以这种方式创建标志会被视为不良做法吗? WHERE,OR声明会更好吗?

2 个答案:

答案 0 :(得分:6)

保证案例陈述按其编写顺序进行评估。使用第一个匹配值。因此,对于您的示例,将返回值0

documentation

清楚地描述了这一点
  

搜索CASE表达式:

     
      
  • 按照指定的顺序评估每个WHEN子句的Boolean_expression。
  •   
  • 返回第一个求值为TRUE的Boolean_expression的result_expression。
  •   
  • 如果没有Boolean_expression计算为TRUE,则数据库引擎会在指定ELSE子句时返回else_result_expression,或者   如果未指定ELSE子句,则为NULL值。
  •   

至于这是好事还是坏事,我会偏向中立。这是ANSI行为,因此您可以依赖它,在某些情况下它非常有用:

select (case when val < 10 then 'Less than 10'
             when val < 100 then 'Between 10 and 100'
             when val < 1000 then 'Between 100 and 1000'
             else 'More than 1000' -- or NULL
        end) as MyGroup

答案 1 :(得分:0)

进一步总结 - 当其中一个WHEN子句为TRUE时,SQL将停止读取case / when语句的其余部分。例如:

SELECT 
    CASE 
        WHEN 3 = 3 THEN 3
        WHEN 4 = 4 THEN 4
    ELSE NULL 
    END AS test 

此语句返回3,因为这是第一个 WHEN子句返回TRUE,即使以下语句也是TRUE。