Top > SQL 入門 > CASE 式

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 関数 も根強い人気がある。

ある式 expr の値を元に分岐するもの
単純 CASE 文は、IF の羅列や SELECT をともなう DECODE 関数を使用するより見やすく、さらに高速に動作する。

CASE 式の書式

CASE expr -- ここに 式 (expr) で WHEN にも 式
	WHEN comparison_expr1 THEN return_expr1 
	WHEN comparison_expr2 THEN return_expr2
	ELSE                       return_default_expr
END
  • カラーコードを名称に変換する CASE 式 の例
SQL> select
  2     color_code,           -- カラーコード
  3     CASE color_code
  4       WHEN 'FFF' THEN 'WHITE'    -- FFF なら白
  5       WHEN '000' THEN 'BACK'      -- 000 なら黒
  6       ELSE             color_code -- それ以外ならコード値を戻す
  7     END color_name
  8  from
  9     color_sample;
 
COLOR_CODE COLOR_NAME
---------- ----------
FFF        WHITE
000        BACK
F00        F00
0F0        0F0
00F        00F
注意

単純 CASE 式 において 比較式 comparison_expr および 戻り値の return_exprdefault_expr に NULL 値 は記述できない。 NULL = NULL の評価は NULL となるため評価されない。参考: CASE 式 と DECODE 関数の違い

検索 CASE 式 (searched case expression)

評価する条件が個々に違うもの ( expr1 = expr2 の形式にならなくても良い )
単純 CASE 式 と比較すると 式 expr の有無と 式 comparison_expr1 なのか 条件文 condition1 なのかで微妙に違っている。
condition1 には 「expr1 比較演算子 expr2」やより複雑な条件文などの記述ができる。

検索 CASE 式の 書式

CASE -- ここに expr の表記がなく WHEN に条件
	WHEN condition1 THEN return_expr1 
	WHEN condition2 THEN return_expr2
	ELSE                 retun default_expr
END

他にも condition1 には、IS NULL や IN 、LIKE など記述も可能

  • 検索 CASE 式を使った 家族構成をあらわした例 (CASE 式は短絡評価)
SQL> select
  2     age, gender,
  3     CASE
  4       WHEN age <= 15    THEN 'child'      -- 15 歳以下
  5       WHEN age <  20    THEN 'young'      -- 20 歳未満
  6       WHEN gender = 'F' THEN 'lady'       -- 以上の条件外で女性
  7       WHEN gender = 'M' THEN 'gentleman'  -- 以上の条件外で男性
  8       ELSE                   'ze'         -- 不詳
  9    END status
 10  from
 11     family;
 
       AGE GENDER STATUS
---------- ------ ----------
         1 F      child
        13 M      child
        19 M      young
        38 F      lady
        39 M      gentleman
<NULL>     <NULL> ze

PL/SQL の 埋め込みSQL と CASE 式

PL/SQL の 埋め込みSQL に CASE 式が使用できるのは Oracle 9i 以上

これは過渡的なもので Oracle 9i より前の PL/SQL パーサは SQL パーサと異なっていることによる。 そのために PL/SQL の中に 直接埋め込まれた SQL(埋め込みSQL)において一部の SQL 構文がサポートされていないということがおきている。Oracle 9i 以降はパーサが統合されているため一部の機能が使えないといったことはないと思われる。

 


SQL 関数 - CASE 関連

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX


日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト