Oracleで条件をわけるには通常、WHERE句を使用するが、
「DECODE」や「CASE」を使えば、SELECT句の中で条件を分けることが可能だ。
本記事では「DECODE」を使ってSELECT句の中で条件を分ける方法を紹介する。
DECODEの使い方
DECODEは以下のように使用する。
// DECODEで条件をわけてSELECTする
SELECT
,DECODE(列名, 値1, 結果1, 値2, 結果2, 結果3)
FROM table1;
指定した列名の値が
- 値1だった場合 →結果1を返す
- 値2だった場合 →結果2を返す
- それ以外の場合 →結果3を返す
という具合に、値の内容によって異なる結果を返すことができる。
DECODEで条件を分けて表示するサンプル
DECODEを使って、例えば以下のように使用することができる。
ランキング(ranking)に対応して表示する内容を変えたいケースである。
SELECT
name AS 氏名
,DECODE(ranking, 1, '金賞', 2, '銀賞', 'それ以外') AS 表彰結果
FROM table1;
--実行結果
+------+------+
| 氏名 | 表彰内容 |
+------+------+
| 太郎 | 金賞 |
| 次郎 | 銀賞 |
| 三郎 | それ以外|
| 四郎 | それ以外|
| 五郎 | それ以外|
+------+------+
※DECODEは「値」で分岐するため、「式」での判定は使えない。
式を使うには「CASE」が便利だ。
DECODEで条件分岐するパターン(NULL)
「DECODE」では「NULL」の判定が可能だ。
--DECODEで電話番号のnullを判定する
SELECT
DECODE(TEL_NO, NULL, '電話番号なし', TEL_NO)
FROM customer;
上記ではTEL_NO(電話番号)がnullの場合に、
「電話番号なし」と表示するようDECODEを使って条件分岐した。
DECODEの問題点(CASEとの違い)
「DECODE」の問題点として「式」が使えないことが挙げられる。
これはCASEと比較して劣る部分だと言える。
従って、大小比較やワイルドカードも使えない。
単に値の内容によって条件分岐させる、プログラミングで言えばちょうどSWITCH構文のような存在だと思って貰えば良い。
DECODEとCASEの使い分け
まず基本的にはCASE式を使うことをおススメする。
「DECODE」と同じことが「CASE」でも可能であるし、「CASE」の方が式・ワイルドカードに対応しており柔軟性が高いためという理由からだ。
しかしながら、
DECODEはCASEに比べて記述量も少ないし、機能も限定的なため、CASEと比較してプログラムをスッキリ理解しやすく書くことが可能なので、適材適所で使い分けるとより良いだろう。
関連記事
https://www.shift-the-oracle.com/sql/functions/decode.html
https://docs.oracle.com/cd/E96517_01/sqlrf/DECODE.html
コメントを残す