Oracle SQL SELECT5 : CASE


おすすめ書籍



CASE式の構文

CASE式はSQL文等の中で、IF...THEN...ELSE...ENDの論理構造を使用できます。
CASE式は関数とは異なり、SELECT文等のなかでの式の扱いになります。
DECODE関数で同様のことができますが、CASE式の方が考えやすくななります。

CASE <単純CASE式> | <検索CASE式> [<ELSE句>] END
<単純CASE式>
 <式>    WHEN <比較式1> THEN <戻り式1>
     [, WHEN <比較式2> THEN <戻り式2>]
      ...
     [, WHEN <比較式n> THEN <戻り式n>]
<検索CASE式>
    WHEN <条件式1> THEN <戻り式1>
 [, WHEN <条件式2> THEN <戻り式2>]
    ...
 [, WHEN <条件式n> THEN <戻り式n>]
<ELSE句>
 ELSE <ELSE式>

単純CASE式では<式>と<比較式n>が一致する最初の<戻り式n>を結果として返します。
WHEN...THENの条件が一致するものが無い場合、<ELSE句>が宣言されていればその<ELSE式>を返します。
<ELSE句>が宣言されていなければ、NULLを返します。

検索CASE式では<条件式n>が一致する最初の<戻り式n>を結果として返します。
WHEN...THENの条件が一致するものが無い場合、<ELSE句>が宣言されていればその<ELSE式>を返します。
<ELSE句>が宣言されていなければ、NULLを返します。


単純CASE式の例

SQL> SELECT 商品コード,商品名,商品区分,
  2  CASE 商品区分
  3   WHEN 'デスクトップパソコン' THEN 'パソコン関連'
  4   WHEN 'ノートパソコン' THEN 'パソコン関連'
  5   ELSE 'その他'
  6  END AS 商品区分2
  7   FROM TM_商品;

商品コード 商品名                                   商品区分             商品区分2
---------- ---------------------------------------- -------------------- ------------
         1 PC-9001                                  デスクトップパソコン パソコン関連
         2 PC-9002                                  デスクトップパソコン パソコン関連
         3 PC-9003                                  デスクトップパソコン パソコン関連
         4 NOTE-1010                                ノートパソコン       パソコン関連
         5 NOTE-1020                                ノートパソコン       パソコン関連
         6 NOTE-1030                                ノートパソコン       パソコン関連
         7 PRT-3001                                 プリンタ             その他
         8 PRT-4001                                 プリンタ             その他
         9 CRT-1001                                 ディスプレイ         その他
        10 CRT-2001                                 ディスプレイ         その他
        11 HUB-A001                                 ネットワーク         その他
        12 HUB-B001                                 ネットワーク         その他
       100 TEST1000                                 デスクトップパソコン パソコン関連

13行が選択されました。

今回の例では商品区分に直接的に区分名を設定していますが、実際の場合では商品区分はコード化されているため、コードから通常の内容の文字列にするにはCASE式は利用価値があると思います。尚、次の例はCASE式の中に関数を含んだものを示します。

SQL> SELECT EMPNO,SAL,
  2  CASE SIGN(SAL - 1500)
  3   WHEN -1 THEN '1500未満'
  4   WHEN 0  THEN '1500同じ'
  5   WHEN 1  THEN '1500より大きい'
  6  END
  7   FROM EMP;

     EMPNO        SAL CASESIGN(SAL-1
---------- ---------- --------------
      7369        800 1500未満
      7499       1600 1500より大きい
      7521       1250 1500未満
      7566       2975 1500より大きい
      7654       1250 1500未満
      7698       2850 1500より大きい
      7782       2450 1500より大きい
      7788       3000 1500より大きい
      7839       5000 1500より大きい
      7844       1500 1500同じ
      7876       1100 1500未満
      7900        950 1500未満
      7902       3000 1500より大きい
      7934       1300 1500未満

14行が選択されました。

検索CASE式の例

前述の単純CASE式の例を検索CASE式に書き換えてみました。

SQL> SELECT EMPNO,SAL,
  2  CASE
  3   WHEN SAL < 1500 THEN '1500未満'
  4   WHEN SAL = 1500 THEN '1500同じ'
  5   ELSE                 '1500より大きい'
  6  END
  7   FROM EMP;

     EMPNO        SAL CASEWHENSAL<15
---------- ---------- --------------
      7369        800 1500未満
      7499       1600 1500より大きい
      7521       1250 1500未満
      7566       2975 1500より大きい
      7654       1250 1500未満
      7698       2850 1500より大きい
      7782       2450 1500より大きい
      7788       3000 1500より大きい
      7839       5000 1500より大きい
      7844       1500 1500同じ
      7876       1100 1500未満
      7900        950 1500未満
      7902       3000 1500より大きい
      7934       1300 1500未満

14行が選択されました。

以下に、条件式の中で数値の大小ではなくNULLの検査も行う例を示します。

SQL> INSERT INTO EMP(EMPNO) VALUES (1000);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> SELECT EMPNO,SAL,
  2  CASE
  3   WHEN SAL < 1500 THEN '1500未満'
  4   WHEN SAL = 1500 THEN '1500同じ'
  5   WHEN SAL > 1500 THEN '1500より大きい'
  6   WHEN SAL IS NULL THEN 'NULL'
  7  END
  8   FROM EMP;

     EMPNO        SAL CASEWHENSAL<15
---------- ---------- --------------
      7369        800 1500未満
      7499       1600 1500より大きい
      7521       1250 1500未満
      7566       2975 1500より大きい
      7654       1250 1500未満
      7698       2850 1500より大きい
      7782       2450 1500より大きい
      7788       3000 1500より大きい
      7839       5000 1500より大きい
      7844       1500 1500同じ
      7876       1100 1500未満
      7900        950 1500未満
      7902       3000 1500より大きい
      7934       1300 1500未満
      1000            NULL

15行が選択されました。





ページのトップへ戻る