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行が選択されました。