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

use*_*742 7 t-sql sql-server

我有一个普遍的问题,当你在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]
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 6

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

这在文档中有清楚的描述:

搜索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
Run Code Online (Sandbox Code Playgroud)