DECODE関数【ORACLE MASTER Silver SQL試験勉強】

DECODE関数の備忘録記事アイキャッチ データベース

DECODE関数についての備忘録です。Oracle独自の条件分岐関数らしいですね。

この記事で分かること
  • DECODE関数の使い方
  • DECODE関数のエラーについて

DECODE関数の基本構文と活用例

DECODE関数の基本構文は以下です。

DECODE(検査値, 条件1, 一致時の結果1, 条件2, 一致時の結果2, …, デフォルト値)

上記のように、まず検査値を指定して、その後に条件1、条件1に当てはまった時の結果、条件2、条件2に当てはまった時の結果……どの条件にも当てはまらなかった時の出力値となります。

livesql.oracle.comにて動作確認をしてみます。使うのはHR.EMPLOYEESテーブルです。

HR.EMPLOYEESテーブルのDEPARTMENT_ID列

従業員のデータが格納されていて、一人一人にDEPARTMENT_ID(部署ID)が振り分けられているため、部署名を日本語で表示させてみます。

実際に書いたSQLは以下です。

select
    employee_id
    , first_name
    , last_name
    , department_id
    , decode(department_id, 90, '役員室', 60, '情報システム部', 'その他部署') as 部署名
from
    HR.EMPLOYEES;

すると以下のような結果になりました。

DECODE関数出力結果

右端の「部署名」の列が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月時点

まとめ

試験問題として、

  • データ型は合っているか?
    ※もしくは、暗黙の型変換ができるか?
  • 比較演算子や不等価演算子を使ってないか?

を問われる傾向が強いように思います!

基本構文と共にチェックしてみてください。

コメント

タイトルとURLをコピーしました