【Oracle】CASE文とDECODE関数の違いと使い分け

【Oracle】CASE文とDECODE関数の違いと使い分け Oracle

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 を使用するのがおすすめです。