2014-03-29 93 views
3

我在SQL(Server 2008)中使用CASE语句时存在一个普遍问题,并且您的WHEN条件中有多个条件为真,但结果标志将不同。CASE语句SQL:情况优先?

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

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] 

一般来说,以这种方式创建标志会被认为是不好的做法吗? OR WHERE,OR语句会更好吗?

+0

我一直认为他们为了评估它们发生在代码的顺序,但仔细想来,我从来没有实际验证过。 – Brandon

+0

从逻辑上说,它是按它编码的顺序排列的。当第一个遇到时,'CASE'将停止,然后第二个然后是其他部分。你测试过了吗? – CodeBird

+0

-1对此没有做任何研究。您可以在Microsoft网站上找到所需的信息。 – Kapol

回答

3

确保案例语句按照它们写入的顺序进行评估。使用第一个匹配值。因此,对于您的示例,将返回值0

这在documentation清楚地描述:

CASE搜索表达式:

  • 求值,在指定的逻辑表达式的顺序为每个WHEN子句。
  • 返回计算结果为TRUE的第一个布尔表达式的result_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