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

The*_*ost 20 sql sybase case 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'
Run Code Online (Sandbox Code Playgroud)

我假设第2行总是在第4行之前执行?然后我读了一些语句,比如' SQL是一种声明性语言,这意味着它告诉SQL引擎要做什么,而不是如何进行

SQL查询的执行顺序

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

4    WHEN r.code ='01' AND r.source != 'PXWeb' then 'A4'   
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 21

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

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

例如

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

即使r.code不等于0120,也可以通过零误差产生除法,即使它等于00,也就是说.我不知道这个特定问题的标准是什么,但我知道某些产品也是如此.


The*_*ost 5

没关系:

“ CASE语句按顺序评估其条件,并从满足条件的第一个条件停止。”

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

  • 但是请注意下面的警告,这是我的回答所警告的:“在某些情况下,在CASE语句接收到表达式的结果作为其输入之前先对表达式求值” (2认同)