2008年6月10日 星期二

Recursive SQL using DB2 UDB 8.2

建立測試table

CREATE TABLE ORION
(
NAME VARCHAR(100) ,
COST VARCHAR(1000)
) IN USERSPACE1;

新增測試資料

Insert into ORION (NAME, COST) Values ('ABC', '101');
Insert into ORION (NAME, COST) Values ('XYZ', '100,101,102,204,203');
Insert into ORION (NAME, COST) Values ('HJK', '130,206');
Insert into ORION (NAME, COST) Values ('KLM', '');
Insert into ORION (NAME, COST) Values ('OPU', '105,109,113,118,117,199,288,287');

運用Recursive SQL將COST欄位裡用逗號區分的資料拆解成多筆資料

WITH N(COL,NAME,COST,COST1) AS (
SELECT 1 COL,NAME,','||COST||',',','||COST||','
FROM  ORION
WHERE  COST > ''
UNION  ALL
SELECT N.COL + 1,N.NAME,N.COST,
     SUBSTR(N.COST1,LOCATE(',',N.COST1,2))
FROM  N
WHERE  N.COL + 1 <= LENGTH(N.COST) -
            LENGTH(REPLACE(N.COST,',','')) - 1
)
SELECT NAME,SUBSTR(COST1,2,LOCATE(',',COST1,2) - 2)
FROM   N
UNION
SELECT NAME,COST
FROM  ORION WHERE COST = ''
ORDER  BY NAME;

得到以下結果

NAME   COST
------- -------
ABC    101
HJK    130
HJK    206
KLM
OPU    105
OPU    109
OPU    113
OPU    117
OPU    118
OPU    199
OPU    287
OPU    288
XYZ    100
XYZ    101
XYZ    102
XYZ    203
XYZ    204