Oracle SQLを学んでいると、「DECODE関数」と「CASE式」の使い分けで迷う方は多いのではないでしょうか。
どちらも条件分岐を行うために利用できますが、機能や表現力には明確な違いがあります。
本記事では、DECODEとCASEの特徴、違い、実務での使い分けポイントをわかりやすく解説します。
1. DECODE関数とは?
DECODE は Oracle独自の関数 で、簡易的な条件分岐を行うために利用されます。
基本構文は次の通りです。
指定した式の値と「検索値」が一致すれば、その「置換値」を返す
一致しなければ最後のデフォルト値を返す(省略可能)
例:部署IDに応じて部署名を返す
|
1 2 3 4 5 6 7 8 9 |
SELECT DECODE( dept_id, 10, '営業部', 20, '人事部', 30, '開発部', 'その他' ) AS dept_name FROM employees; |
2. CASE式とは?
CASE は SQL標準 でサポートされる条件分岐の構文です。
Oracleだけでなく、他のデータベース(MySQL、PostgreSQLなど)でも使えます。
構文(シンプルCASE)
|
1 2 3 4 5 6 |
CASE 式 WHEN 値1 THEN 結果1 WHEN 値2 THEN 結果2 ... ELSE 結果N END |
構文(検索CASE)
|
1 2 3 4 5 6 |
CASE WHEN 条件式1 THEN 結果1 WHEN 条件式2 THEN 結果2 ... ELSE 結果N END |
例:部署IDに応じて部署名を返す
|
1 2 3 4 5 6 7 8 |
SELECT CASE dept_id WHEN 10 THEN '営業部' WHEN 20 THEN '人事部' WHEN 30 THEN '開発部' ELSE 'その他' END AS dept_name FROM employees; |
3. DECODEとCASEの比較
| 項目 | DECODE | CASE |
|---|---|---|
| 標準SQL | Oracle独自機能 | SQL標準でサポート |
| 構文 | 関数形式 | 式形式 |
| 条件 | 「等しい場合」のみ判定可能 | !ERROR! C4 -> Formula Error: Unexpected , |
| 可読性 | ネストが増えると読みにくい | 複雑な条件もわかりやすく記述可能 |
| 移植性 | Oracleに依存 | 他DBでも利用可能 |
| 推奨度 | 古いコードに多い | 現在はこちらが主流 |
4. 実務での使い分けポイント
既存システムのSQLでDECODEが多用されている → 互換性を保つためそのまま使用するケースあり
新規開発や複雑な条件分岐 → 可読性・移植性を考えて CASE式を推奨
DB移行を見据える場合 → CASE式を選択しておくと移植がスムーズ
📌 サンプル SQL 例(実務でよく使うパターン)
✅ ① 条件によって値を返す(部署名判定)
🔹 DECODE を使った例(Oracle専用)
|
1 2 3 4 5 6 7 8 9 |
SELECT employee_id, dept_id, DECODE(dept_id, 10, '営業部', 20, '人事部', 30, '開発部', 'その他') AS dept_name FROM employees; |
👉 dept_id が 10/20/30 それぞれ該当する部署名を返し、それ以外は “その他” を返す例です。覚え書き.com
🔹 CASE 式で同じ処理を記述(標準SQL)
|
1 2 3 4 5 6 7 8 9 10 |
SELECT employee_id, dept_id, CASE dept_id WHEN 10 THEN '営業部' WHEN 20 THEN '人事部' WHEN 30 THEN '開発部' ELSE 'その他' END AS dept_name FROM employees; |
👉 Oracle 以外のDB(MySQL、PostgreSQL、SQL Server など)でも利用可能。覚え書き.com
✅ ② 複数条件の判定(検索CASE)
|
1 2 3 4 5 6 7 8 9 |
SELECT employee_id, salary, CASE WHEN salary >= 100000 THEN 'High' WHEN salary >= 50000 THEN 'Medium' ELSE 'Low' END AS salary_grade FROM employees; |
👉 DECODE では対応しづらい 複雑条件 を CASE 式で表現。覚え書き.com
✅ ③ NULL 判定を含む例
🔹 CASE で NULL を評価
|
1 2 3 4 5 6 7 8 |
SELECT employee_id, commission_pct, CASE WHEN commission_pct IS NULL THEN 'No Commission' ELSE 'Has Commission' END AS commission_status FROM employees; |
👉 NULL を明示的に判定して出力を整えるパターンです。覚え書き.com
✅ ④ DECODE × WHERE 句の実用例
|
1 2 3 4 5 6 |
SELECT employee_id, dept_id, DECODE(status, 'A', 'Active', 'I', 'Inactive', 'Unknown') AS status_jp FROM employees WHERE DECODE(status, 'A', 'Active', 'I', 'Inactive') = 'Active'; |
👉 status が “A:Active” の社員のみ抽出しつつ、ラベル変換も同時に実行する例。
まとめ
DECODE関数:Oracle独自。簡単な条件分岐向け。古いSQLでよく見かける。
CASE式:SQL標準。複雑な条件も書けて、移植性・可読性に優れる。
👉 今後の開発では CASE式を優先的に利用 するのがおすすめです。


