SQL の IF 「CASE 〜 WHEN 式」
SQL においての IF ともいえる CASE 式 には Oracle 9i より以前からある 「単純 CASE 式」 と Oracle 9i 以降に実装された 「検索 CASE 式」 の 2種類がある。また、PL/SQL においても CASE 文 がサポートされている。SELECT のリストに記述できるのはもちろん、LIKE などの条件式と CASE 式 併用して WHERE 句や GROUP BY、HAVING や ORDER BY 句に記述することで場合分けによる異なる式や値による更新、条件付けによる抽出と並び替えなど非常に強力な SQL を記述ができる。
単純 CASE 式 (simple case expression)
CASE に指定した ある式 expr の式の値と 比較対象の式の値 comparison_expr1 をマッチングさせ該当する値をもつ位置の 戻り値 ret_expr1 を戻す式である。 (Oracle 8i 以前でも使用できる)
単純 CASE 式 は DECODE 関数を使用するより見やすく書ける。しかし、2、3個の比較の場合や NULL との比較が1つの構文で短く記述できる DECODE 関数 も根強い人気がある。
ある式の値を元に分岐するもの
単純 CASE 文は、IF の羅列や SELECT をともなう DECODE 関数を使用するより見やすく、さらに高速に動作する。
CASE expr
WHEN comparison_expr1 THEN return_expr1
WHEN comparison_expr2 THEN return_expr2
ELSE return default_expr
END
単純 CASE 式 を 汎用的なプログラム?で表現するなら以下のようなステートメントをもつ関数であらわすことができる。
-- PL/SQL による記述ではない
FUNCTION CASE(expr, comparison_expr1, ret_expr1, .... default_expr)
BEGIN
IF (expr = comparison_expr1) THEN
return return_expr1;
ELSE IF (expr = comparison_expr2) THEN
return return_expr2;
END IF;
return default_expr;
END FUNCTION
注意
単純 CASE 式 において 比較式 comparison_expr および 戻り値の return_expr、 default_expr に NULL 値 は記述できない。 NULL = NULL の評価は NULL となるため評価されない。参考: CASE 式 と DECODE 関数の違い
検索 CASE 式 (searched case expression)
評価する条件が個々に違うもの ( expr1 = expr2 の形式にならなくても良い )
単純 CASE 式 と比較すると 式 expr の有無と 式 comparison_expr1 なのか 条件文 condition1 なのかで微妙に違っている。 condition1 には expr1 比較演算子 expr2 などの記述ができる。
CASE
WHEN condition1 THEN return_expr1
WHEN condition2 THEN return_expr2
ELSE retun default_expr
END
他にも condition1 には、IS NULL や IN 、LIKE など記述も可能
PL/SQL の 埋め込みSQL と CASE 式
PL/SQL の 埋め込みSQL に CASE 式が使用できるのは Oracle 9i 以上
これは過渡的なもので Oracle 9i より以前の PL/SQL パーサは SQL パーサと異なっていることによる。
そのために PL/SQL の中に 直接埋め込まれた SQL(埋め込みSQL)において一部の SQL 構文がサポートされていないということがおきている。Oracle 9i 以降はパーサが統合されているため一部の機能が使えないといったことはないと思われる。
SQL 関数 - CASE 関連