Порядок выполнения предложений WHEN в операторе CASE

Учитывая следующий текст дела:

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? Затем я читал такие утверждения, как "SQL - это декларативный язык, а это означает, что он говорит движку SQL, что делать, а не как" в

Порядок выполнения SQL-запроса

и интересно, относится ли это также к порядку выполнения в заявлении CASE. По существу, могу ли я оставить код выше, так как он не должен менять строку 4 на

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

Ответ 1

Возвращаемое значение будет значением выражения 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'

может генерировать деление нулевой ошибкой, даже если r.code не равен 0120, и даже если он равен 00, скажем. Я не знаю, что стандарт должен сказать по этой конкретной проблеме, но я знаю, что это относится к некоторым продуктам.

Ответ 2

Неважно:

"Оператор CASE последовательно оценивает свои условия и останавливается с первым условием, условие которого выполняется".

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

Ответ 3

AFAIK. Порядок оценки CASE будет таким, каким вы указали в своем запросе. Таким образом, в вашем случае порядок оценки будет 1,2,3,4..., 7

могу ли я оставить код выше, так как он не должен менять строку 4 на

Вы можете изменить свой 2-й CASE и включить ELSE часть, как ELSE ниже, которая позаботится о 4-й оценке CASE и вы можете полностью удалить 4-ю оценку

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