Порядок выполнения предложений 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'