DECODE関数

ORACLE

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式)



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