次のケースステートメントの本文があるとします。
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エンジンに、どのように」ではなく、何をすべきかを指示します。
これもCASE文の実行順序に関係があるのだろうか。基本的に、4行目を次のように変更せずに、上記のコードをそのままにできますか?
4 WHEN r.code ='01' AND r.source != 'PXWeb' then 'A4'
返される値は、一致する最初の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.code
が0120
に等しくなくても、たとえば00
に等しい場合でも、ゼロ除算エラーを生成します。この特定の問題について規格が何を言っているのかはわかりませんが、一部の製品に当てはまることはわかっています。
気にしないで:
「CASEステートメントはその条件を順次評価し、条件が満たされた最初の条件で停止します。」
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'