Oracle SQL SELECT5 : CASE
おすすめ書籍
- 図解入門よくわかる最新Oracleデータベースの基本と仕組み[第4版] (How‐nual Visual Guide Book)
- Oracleの基本 ~データベース入門から設計/運用の初歩まで
- [改訂第4版]SQLポケットリファレンス
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行が選択されました。