DECODE関数は、ある項目の値を元に条件分岐させるORACLE独自の関数です。
DECODE関数の解説と、よく似ている単純CASE式との比較をしていきます。
DECODE関数とは
DECODE関数は、ある項目の値を元に条件分岐させる関数です。
ORACLE独自の関数で、比較的よく使われている関数なので他のDBにリプレイスする際は注意が必要になります。
-- aがbの時cを設定し、一致する値がない時はdを設定 -- bとcのセットは、最低1つ指定し、ELSEは省略可能 -- ELSEを省略した場合で、一致する値がない時はNULLを設定します DEOCDE(a, b1, c1, b2, c2, d)
以下具体的な使用例です。
SELECT gender
,DECODE(gender, '1', 'MAN', '2', 'WOMAN', 'UNKNOWN') gender_name
FROM test_table
;
GENDER GENDER_NAME
------- -----------
1 MAN
2 WOMAN
3 UNKNOWN
DECODE関数と単純CASE式の共通点
DECODE関数は、単純CASE式とほぼ同じ使い方が出来ます。
SELECT gender
,DECODE(gender, '1', 'MAN', '2', 'WOMAN', 'UNKNOWN') a
,CASE gender
WHEN '1' THEN 'MAN'
WHEN '2' THEN 'WOMAN'
ELSE 'UNKNOWN'
END b
FROM test_table
;
GENDER A B
------- ----------- -----------
1 MAN MAN
2 WOMAN WOMAN
3 UNKNOWN UNKNOWN
DECODE関数の方が簡潔に記述出来るため、比較的よく使われる傾向にあります。
また、GROUP BY句やORDER BY句への記述も、単純CASE式と同様に使うことが出来ます。
DECODE関数と単純CASE式の異なる点
よく似ているDECODE関数と単純CASE式ですが、異なる点もあります。
まず1つ目ですが、NULLの評価がDECODE関数は出来ますが、単純CASE式は出来ません。
SELECT a
,DECODE(a, '1', 100, NULL, 200, 300) b
,CASE a
WHEN '1' THEN 100
WHEN NULL THEN 200
ELSE 300
END c
FROM test_table
;
A B C
- ------- -------
1 100 100
2 300 300
200 300
2つ目、PL/SQLにおいてDECODE関数は使用出来ませんが、単純CASE式は出来ます。
-- DECODE関数(エラーとなる) CREATE OR REPLACE FUNCTION func_sample(a IN NUMBER) RETURN NUMBER IS BEGIN RETURN DECODE(a, 1, 100, 200); END; / -- 単純CASE式(問題なく使える) CREATE OR REPLACE FUNCTION func_sample(a IN NUMBER) RETURN NUMBER IS BEGIN RETURN CASE a WHEN 1 THEN 100 ELSE 200 END; END; /
まとめ
ORACLEの独自関数ではありますが、DECODE関数は比較的よく使わている関数です。ごちゃごちゃしがちな条件分岐の際にも、きれいにコードがまとまりやすいです。
仕様を理解しておきましょう。
関連(CASE式)




