オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【SQL】DECODE関数の使い方 (ORACLE DATABASE 12C SQL基礎)

ORACLE DATABASE 12c SQL基礎(1Z0-061)の試験範囲でもある、
DECODE関数の使用方法を紹介します。


目次

DECODE関数について

DECODE関数は以下のような書式で使います。
列の値が条件値1に合致する場合は値1を返し、条件値nに合致する場合は値nを返します。いずれの条件値にも合致しない場合はデフォルト値を返します。(デフォルト値を指定しない場合はNULLを返します)



書式: DECODE(列, 条件値1 , 値1[, ・・・条件値n, 値n] [, デフォルト値])


以下のテーブルを使って、実際にDECODE関数の使い方を確認してみましょう。

EMPLOYEE_ID DEPARTMENT_ID NAME PHONE SALARY MANAGER_ID
1 10 山田 00000000000 500000 « NULL »
2 10 佐藤 00000000001 450000 1
3 10 鈴木 00000000002 450000 1
4 10 田中 00000000003 300000 1
5 10 山本 00000000004 220000 1
6 20 00000000005 470000 « NULL »
7 20 中村 00000000006 250000 6
8 20 松本 00000000007 220000 6
9 30 井上 00000000008 210000 10
10 30 木村 00000000009 300000 « NULL »

DECODE関数の使用例

DEPARTMENT_IDが10の場合は経営管理部、20の場合は営業部、それ以外はその他と返すSQLを考えます。

SELECT EMPLOYEE_ID,NAME,DECODE(DEPARTMENT_ID, 10, '経営管理部', 20, '営業部','その他') FROM TEST5;


SQLの結果
f:id:auroralights:20210617220217p:plain


列名が「DECODE(DEPARTMENT_ID, 10, '経営管理部', 20, '営業部','その他')」と非常に長いので、以下のように列別名をつけてみましょう。
可読性を高めるために、インデントもつけてみます。

SELECT 
  EMPLOYEE_ID,
  NAME,
  DECODE(DEPARTMENT_ID, 10, '経営管理部',
                          20, '営業部',
                          'その他') AS 部署
FROM TEST5;


SQLの結果
f:id:auroralights:20210617220546p:plain

DECODE関数の使用例2

MANAGER_IDに値がある場合は〇〇さんの部下、MANAGER_IDに値がない場合は部署長と返すSQLを考えてみましょう。

SELECT 
  EMPLOYEE_ID,
  NAME,
  DECODE(MANAGER_ID, NULL, '部署長',
                                        1, '山田さんの部下',
					6, '森さんの部下',
                                        10, '木村さんの部下') 
FROM TEST5;

f:id:auroralights:20210617221836p:plain


以下のように部署長をデフォルトにする書き方もできます。

SELECT 
  EMPLOYEE_ID,
  NAME,
  DECODE(MANAGER_ID, 1, '山田さんの部下',
					 6, '森さんの部下',
                                         10, '木村さんの部下',
                                          '部署長') 
FROM TEST5;