CASE语句中WHEN子句的执行顺序

时间:2014-07-02 10:45:35

标签: sql case sybase case-when

鉴于以下案例陈述的主体:

1    WHEN r.code= '00'                        then 'A1'
2    WHEN r.code ='01' AND r.source = 'PXWeb' then 'A2'   <
3    WHEN r.code ='0120'                      then 'A3'
4    WHEN r.code ='01'                        then 'A4'   <
5    WHEN r.code ='1560'                      then 'A5'
6    WHEN r.code ='1530'                      then 'A6'
7    WHEN r.code ='1550'                      then 'A7'

我假设第2行总是在第4行之前执行?然后我阅读了诸如&#39; 之类的语句SQL是一种声明性语言,这意味着它告诉SQL引擎要做什么,而不是&#39;在

Order Of Execution of the SQL query

并想知道这是否也与CASE语句中的执行顺序有关。基本上,我可以保留上面的代码,而不必将第4行更改为

4    WHEN r.code ='01' AND r.source != 'PXWeb' then 'A4'   

3 个答案:

答案 0 :(得分:18)

返回的值将是匹配的最早THEN子句(文本)的WHEN表达式的值。这意味着如果符合第2行条件,结果将为A2

但是,如果您的THEN表达式比文字值更复杂,那么即使不需要该表达式,评估这些表达式的一些工作也可能发生。

E.g。

 WHEN r.code= '00'                        then 'A1'
 WHEN r.code ='01' AND r.source = 'PXWeb' then 'A2'
 WHEN r.code ='0120'                      then 1/0
 WHEN r.code ='01'                        then 'A4'
即使r.code不等于0120

也可以生成除零错误,即使它等于{{1比如说。我不知道标准在这个特定问题上有什么说法,但我知道某些产品也是如此。

答案 1 :(得分:3)

没关系:

&#34; CASE语句按顺序评估其条件,并在条件满足的第一个条件下停止。&#34;

http://msdn.microsoft.com/en-gb/library/ms181765.aspx

答案 2 :(得分:2)

AFAIK,CASE评估的顺序将是您在查询中指定的顺序。因此,在您的情况下,评估顺序为1,2,3,4 ... , 7

  

我可以保留上面的代码,而不必将第4行更改为

您可以更改第二个CASE并添加一个ELSE部分,如下所示,这将评估第4次CASE评估,您可以完全删除第4次评估

2    WHEN r.code ='01' AND r.source = 'PXWeb' then 'A2' ELSE 'A4'