DECODE関数についての備忘録です。Oracle独自の条件分岐関数らしいですね。
- DECODE関数の使い方
- DECODE関数のエラーについて
DECODE関数の基本構文と活用例
DECODE関数の基本構文は以下です。
DECODE(検査値, 条件1, 一致時の結果1, 条件2, 一致時の結果2, …, デフォルト値)
上記のように、まず検査値を指定して、その後に条件1、条件1に当てはまった時の結果、条件2、条件2に当てはまった時の結果……どの条件にも当てはまらなかった時の出力値となります。
livesql.oracle.comにて動作確認をしてみます。使うのはHR.EMPLOYEESテーブルです。

従業員のデータが格納されていて、一人一人にDEPARTMENT_ID(部署ID)が振り分けられているため、部署名を日本語で表示させてみます。
実際に書いたSQLは以下です。
select
employee_id
, first_name
, last_name
, department_id
, decode(department_id, 90, '役員室', 60, '情報システム部', 'その他部署') as 部署名
from
HR.EMPLOYEES;
すると以下のような結果になりました。

右端の「部署名」の列がDECODE関数の結果です。
構文通り、検査値(DEPARTMENT_ID)が90の時に「役員室」が入り、60の時に「情報システム部」が入り、それ以外のIDである100の時に「その他部署」と入っています。
データを翻訳したいときに使われるイメージです。
エラーになるDECODE関数の書き方
資格勉強中に「これよく出るな」と思ったエラーを2つ挙げます。
データ型の不一致
DECODE関数は、第3引数(左から3番目)のデータ型を出力結果の基準とします。
そして後続のデータ型が暗黙の型変換で第3引数のデータ型に変換できなかったらエラーになります。
たとえば以下の書き方だと、第3引数のデータ型が数値型なのに、その後ろに設定したデフォルト値が日付型なのでエラーになります。
select
employee_id
, first_name
, last_name
, department_id
, decode(department_id, 90, 999, hire_date) as 部署名
from
HR.EMPLOYEES;

DECODE関数の問題が出たら後続のデータ型が第3引数のデータ型に変換できるか確認しましょう。
第3引数は「役員室(文字型)」、デフォルト値は「999(数値型)」なのでデータ型は違うけど、「999」は文字列として変換できるのでエラーじゃないですよ、みたいな。
比較演算子や不等価演算子の条件指定 ※試験問題において
資格試験問題の中では、DECODE関数は比較演算子(>、<、>=、<=)や不等価演算子(!=、<>、^=)を使おうとしたらエラーになります。
つまり試験基準では、DECODE関数は等価比較しかできません。
ただ、最新版のOracleでは比較演算子や不等価演算子を含む式を指定してもSQL自体は実行できます。比較演算子を使った条件分岐ができるようになったというよりは、比較演算子を含む式が評価され、その結果を使ってDECODEの処理が行われるイメージです。
ORACLE MASTER Silver SQLの範囲では昔の挙動が基準になっているので、実際のOracleの挙動と試験問題の内容に違いがあるようです。
試験問題では、以下のような書き方をするとエラーになります。
decode(salary, salary >= 20000, ‘高給’, ‘普通’)
「この選択肢の中でエラーなく実行できるのはどれですか?」みたいな時に、ひっかけとして「比較演算子や不等価演算子を使ったDECODE関数」が出てきます。
livesql.oracle.comでは普通に通りましたが、資格試験の解答としては「DECODEで比較演算子や不等価演算子は使えない(使いたい場合はCASE式を用いる)」が正解なので注意が必要です。
※2026年9月時点
まとめ
試験問題として、
- データ型は合っているか?
※もしくは、暗黙の型変換ができるか? - 比較演算子や不等価演算子を使ってないか?
を問われる傾向が強いように思います!
基本構文と共にチェックしてみてください。

コメント