Oracleデータベースで条件分岐を行う際によく使われるのが CASE文 と DECODE関数 です。どちらも条件に応じて異なる値を返すことができますが、それぞれに特性と適した使い方があります。この記事では、その違いと使い分けについて詳しく解説します。
CASE文とは?
CASE文は、SQLの標準構文として広く使われており、可読性に優れ、複雑な条件分岐にも対応できます。構文には主に2種類あります。
単純CASE式
CASE 列名
WHEN 値1 THEN 結果1
WHEN 値2 THEN 結果2
ELSE デフォルト結果
END
検索CASE式
CASE
WHEN 条件1 THEN 結果1
WHEN 条件2 THEN 結果2
ELSE デフォルト結果
END
例:得点に応じた評価を表示
SELECT
student_name,
score,
CASE
WHEN score >= 80 THEN '優'
WHEN score >= 60 THEN '良'
ELSE '不可'
END AS 評価
FROM scores;
DECODE関数とは?
DECODE関数はOracle独自の関数で、単純な値の比較には非常に簡潔に記述できます。ただし、構文が固定的で、複雑な条件や演算には不向きです。
基本構文
DECODE(比較対象, 値1, 結果1, 値2, 結果2, ..., デフォルト結果)
例:数値に応じた文字列を返す
SELECT
job_id,
DECODE(job_id,
'AD_PRES', '社長',
'IT_PROG', 'プログラマ',
'その他') AS 職種名
FROM employees;
CASEとDECODEの違い
比較項目 | CASE文 | DECODE関数 |
---|---|---|
標準SQL対応 | 〇(標準SQL) | ×(Oracle専用) |
比較方法 | 論理式(<, >, =など)も可 | = のみ |
可読性 | 高い | 条件が多いと読みにくい |
ネストの扱い | 書きやすい | 可読性が下がりやすい |
NULLの扱い | 明示的に判断可能 | 内部的にNULLも比較対象 |
使い分けのポイント
- 簡単な等価比較には DECODE を使うと簡潔に記述できます。
- 複雑な条件や 複数の比較演算子(<, >, IS NULLなど) を使う場合は CASE を使うべきです。
- 標準SQLに準拠した移植性の高いコードを求める場合は CASE を選びましょう。
まとめ
Oracleでは CASE も DECODE も使えますが、目的や条件の複雑さに応じて使い分けることで、より効率的で可読性の高いSQLを書くことができます。特に新規開発や将来的な他DBへの移行を考慮する場合は、原則として CASE を使用するのがおすすめです。