如图,要将my_list 列变为 my_list2 列 ,测试数据如下
CREATE TABLE test_num
(my_LIST VARCHAR2(125));
insert into test_num (MY_LIST)
values ('1,4');
insert into test_num (MY_LIST)
values ('9,2,1');
insert into test_num (MY_LIST)
values ('2,4,1,');
insert into test_num (MY_LIST)
values ('1,4,6');
insert into test_num (MY_LIST)
values ('7');
insert into test_num (MY_LIST)
values ('8,1');
insert into test_num (MY_LIST)
values ('7,5,3,2');
查询语句如下:
SELECT MY_LIST,LISTAGG(STR,',') WITHIN GROUP( ORDER BY STR)MY_LIST2 FROM (
SELECT DISTINCT MY_LIST,SUBSTR(COLNAME,INSTR(COLNAME, ',',1,LEVEL)+1,
INSTR(COLNAME,',',1,LEVEL+1)-
INSTR(COLNAME,',',1,LEVEL)-1)STR
FROM (SELECT MY_LIST,','||MY_LIST||',' AS COLNAME FROM test_num)
CONNECT BY LEVEL<LENGTH(COLNAME)-LENGTH(REPLACE(COLNAME,','))
) GROUP BY MY_LIST;
SELECT (SELECT LISTAGG(REGEXP_SUBSTR(MY_LIST, '[^,]+', 1, LEVEL), ',') WITHIN GROUP(ORDER BY TO_NUMBER(REGEXP_SUBSTR(MY_LIST, '[^,]+', 1, LEVEL)))
FROM DUAL CONNECT BY REGEXP_SUBSTR(MY_LIST, '[^,]+', 1, LEVEL) IS NOT NULL) AA
FROM test_num;