Oracle SQL SELECT5 : CASE
おすすめ書籍
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。
- 図解入門よくわかる最新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行が選択されました。 |
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。