CASE 式 と CASE 文 の違い

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 文 (Oracle 9i) の場合、条件の評価は1回または複数回

    単純 CASE 文 であれば評価は1回であり、検索 CASE 文 においては記述されている回数だけ評価される。

CASE 式と CASE 文 では内部の動作が微妙に異なっているので心に留めておくとがよいだろう。

検索 CASE 式 Oracle 9i の評価回数の確認

CASE 文 の確認方法は割愛、確認したい場合には発番するファンクションなどを作って確認する。

DROP SEQUENCE RIVUS.EXPR_SEQ ;
CREATE SEQUENCE RIVUS.EXPR_SEQ ;
SELECT
	CASE 
	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

PL/SQL に埋め込まれた SQL と CASE 式

PL/SQL および 埋め込みSQL に CASE 式 が使用できるのは Oracle 9i 以上 (※)
(EXECUTE IMMEDIATE による 動的SQL を使用すれば使えるかも)⇒ システム固有の動的 SQL

(※) Oracle 9i より前の PL/SQL engine(PL/SQL の文法解析)は SQL engine と異なっている。そのために 「埋め込みSQL」 において一部の SQL 構文がサポートされていない。 (Oracle 9i 以降は完全に統合されるようになった)

 


CASE 関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)