“DECODE”は引数と判定値を比較し、等しい場合に結果値を返す関数です。
構文 select decode (引数,判定値1,結果値1,判定値2,結果値2,..)from ..;
SQL> select decode(deptno,10,'ACCOUNTING', 20,'RESEARCH', 30,'SALES', 40,'OPERATIONS') 部署名 from emp; 部署名 ---------- RESEARCH SALES SALES RESEARCH SALES SALES ACCOUNTING ACCOUNTING SALES SALES RESEARCH ACCOUNTING
おなじみのEMP表より、DEPTNOを引数として部署名を返しています。では、リスト1のSALES表より、DECODE関数を使って四半期別の売り上げ集計値を求めてみましょう。
SQL> select decode(month,1,'1Q',2 ,'1Q',3 ,'1Q', 4,'2Q',5 ,'2Q',6 ,'2Q', 7,'3Q',8 ,'3Q',9 ,'3Q', 10,'4Q',11,'4Q',12,'4Q') quarter, sum(sal) from sales group by decode(month,1,'1Q',2 ,'1Q',3 ,'1Q', 4,'2Q',5 ,'2Q',6 ,'2Q', 7,'3Q',8 ,'3Q',9 ,'3Q', 10,'4Q',11,'4Q',12,'4Q'); QUARTER SUM(SAL) ------- ---------- 1Q 318000 2Q 301500 3Q 321600 4Q 442200
8〜11行目のDECODE関数にてmonth列の判定を以下のように行っています。
UNION ALLを使用した場合と違って、SALES表へのアクセスは1回で済みます。
“SIGN”は
を返す関数です。
SQL> select sign(5-10),sign(5-5),sign(5-1) from dual; SIGN(5-10) SIGN(5-5) SIGN(5-1) ---------- ---------- ---------- -1 0 1
この関数を使用して、四半期別の集計値を求めることもできます。
SQL> select decode(sign(month- 4),-1,'1Q', decode(sign(month- 7),-1,'2Q', decode(sign(month-10),-1,'3Q','4Q'))) quarter, sum(sal) from sales group by decode(sign(month- 4),-1,'1Q', decode(sign(month- 7),-1,'2Q', decode(sign(month-10),-1,'3Q','4Q'))); QUARTER SUM(SAL) ------- ---------- 1Q 318000 2Q 301500 3Q 321600 4Q 442200
DECODE関数でもいいではないかと思われるかもしれませんが、SIGN関数の大きなメリットは、以下のような場合に本領を発揮します。
SQL> select decode(sign(product_code-100),-1,'0___', decode(sign(product_code-200),-1,'1___', decode(sign(product_code-300),-1,'2___', decode(sign(product_code-400),-1,'3___', decode(sign(product_code-500),-1,'4___'))))) Code, sum(sal) from sales group by decode(sign(product_code-100),-1,'0___', decode(sign(product_code-200),-1,'1___', decode(sign(product_code-300),-1,'2___', decode(sign(product_code-400),-1,'3___', decode(sign(product_code-500),-1,'4___'))))) order by 1; CODE SUM(SAL) ---- ---------- 0___ 207000 1___ 227700 2___ 211000 3___ 385700 4___ 351900
上記の例をDECODE関数のみで実行しようとすると、すべての商品コードをDECODE関数の引数として羅列する必要があるので大変ですね。(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.