web-dev-qa-db-ja.com

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行目より前に実行されると思いますか?次に、「SQLは宣言型言語です。つまり、SQLエンジンに、どのように」ではなく、何をすべきかを指示します。

SQLクエリの実行順序

これもCASE文の実行順序に関係があるのだろうか。基本的に、4行目を次のように変更せずに、上記のコードをそのままにできますか?

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

返される値は、一致する最初のTHEN句のWHEN式の値です(テキスト的に)。つまり、2行目の条件が満たされた場合、結果はA2になります。

ただし、THEN式が単なるリテラル値よりも複雑な場合、式が必要ない場合でもevaluateへの作業の一部が発生する可能性があります。

例えば。

 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'

couldr.code0120に等しくなくても、たとえば00に等しい場合でも、ゼロ除算エラーを生成します。この特定の問題について規格が何を言っているのかはわかりませんが、一部の製品に当てはまることはわかっています。

24

気にしないで:

「CASEステートメントはその条件を順次評価し、条件が満たされた最初の条件で停止します。」

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

5
The Ghost

AFAIK、CASE評価の順序は、クエリで指定した順序になります。したがって、あなたの場合、評価の順序は1,2,3,4 ... , 7

上記のコードをそのままにして、4行目を

2番目のCASEを変更し、4番目のELSE評価を処理する以下のようなCASE部分を含めることができ、4番目の評価を完全に削除できます。

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