“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.