我在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声明会更好吗?
答案 0 :(得分: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
答案 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。