SQL は CASE 式 のみで CASE 文 は記述できない。 CASE 文は PL/SQL で記述するステートメントである。
CASE 式 : 条件毎のセミコロンがなく、CASE の最後は END で終了するファンクションのようなものである。当然であるが式なので評価や代入文にも使用できる。
CASE 文 : 複数のステートメントから構成される。構文の違いは以下参照
単純 CASE (simple case) の書き方の違い
CASE 式 - CASE で始まり END で終了する。 expr と comparison_expr を比較し真偽判定をする。
CASE expr -- CASE 式
WHEN comparison_expr1 THEN ret_expr1 -- 式や値を記述する
WHEN comparison_expr2 THEN ret_expr2
ELSE default_expr
END -- END で終了する
CASE 文 - CASE で始まり END CASE で終わる。ステートメントなので 'END CASE;' とセミコロンも必要。
comparison_expr で真偽を判定する。
CASE-- CASE 文
WHEN comparison_expr1 THEN statement1 -- ステートメントを記述する
WHEN comparison_expr2 THEN statement2
ELSE default_statement
END CASE; -- END CASE で終了する
CASE 式 と CASE 文 の評価の違い
CASE 式 と CASE 文 には条件句の評価の方法にも違いがあるので要注意である。(Oracle 10g の環境のみで確認した内容です)
CASE 式 の場合 条件評価は1回または複数回
単純 CASE 式 であれば、評価は1回である(※1)。
しかし、検索 CASE 式 においては評価される回数は複数回または1回である(※2)。
(※1) CASE 式 と良く比較される DECODE 関数も評価は1回しか行わない。
(※2) 対象がファンクションの場合で評価式が単純 CASE 式に置き換え可能なパターンの場合には呼び出し回数が1回にチューニングされることがある(少しイジワルな書き方をするとチューニングされない)。シーケンスの場合には常に1回になる。(情報提供に感謝致します)
CASE 文 () の場合、条件の評価は1回または複数回
単純 CASE 文 であれば評価は1回であり、検索 CASE 文 においては記述されている回数だけ評価される。
CASE 式と CASE 文 では内部の動作が微妙に異なっているので心に留めておくとがよいだろう。
検索 CASE 式 の評価回数の確認
CASE 文 の確認方法は割愛、確認したい場合には発番するファンクションなどを作って確認する。
DROP SEQUENCE RIVUS.EXPR_SEQ ;
CREATE SEQUENCE RIVUS.EXPR_SEQ ;
SELECTCASE
WHEN EXPR_SEQ.NEXTVAL = 2 THEN '弐'
WHEN EXPR_SEQ.NEXTVAL = 3 THEN '参'
WHEN EXPR_SEQ.NEXTVAL = 1 THEN '壱'
ELSE 'それ以外' END "NEXTVAL"
FROM DUAL ;
NEXTVAL
----------------
壱
SELECT EXPR_SEQ.NEXTVAL FROM DUAL ;
NEXTVAL
----------
2