我有一个普遍的问题,当你在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声明会更好吗?
保证案例陈述按其编写顺序进行评估.使用第一个匹配值.因此,对于您的示例,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)