SELECT regexp_substr('公司1,贵公司2', '[^,]+', 1, LEVEL, 'i')
FROM dualCONNECT BY LEVEL <= length('公司1,贵公司2') - length(REPLACE('公司1,贵公司2', ',', '')) + 1以上为字符串带分隔符的转换为列
Oracle11.2新增了LISTAGG函数,可以用于字符串聚集,测试如下:
1,版本SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE 11.2.0.1.0 ProductionTNS for Linux: Version 11.2.0.1.0 - ProductionNLSRTL Version 11.2.0.1.0 - Production2,测试数据SQL> SQL> select empno,ename,deptno from scott.emp;EMPNO ENAME DEPTNO----- ---------- ------7369 SMITH 207499 ALLEN 307521 WARD 307566 JONES 207654 MARTIN 307698 BLAKE 307782 CLARK 107788 SCOTT 207839 KING 107844 TURNER 307876 ADAMS 207900 JAMES 307902 FORD 207934 MILLER 1014 rows selected3,作为聚集函数SQL> SELECT deptno,2 LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees3 FROM scott.emp4 GROUP BY deptno;DEPTNO EMPLOYEES------ --------------------------------------------------------------------------------10 CLARK,KING,MILLER20 ADAMS,FORD,JONES,SCOTT,SMITH30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARDSQL> --更换排序列SQL> SELECT deptno,2 LISTAGG(ename, ',') WITHIN GROUP(ORDER BY hiredate) AS employees3 FROM scott.emp4 GROUP BY deptno;DEPTNO EMPLOYEES------ --------------------------------------------------------------------------------10 CLARK,KING,MILLER20 SMITH,JONES,FORD,SCOTT,ADAMS30 ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES--order by必须存在SQL> SELECT deptno,2 LISTAGG(ename, ',') WITHIN GROUP() AS employees3 FROM scott.emp4 GROUP BY deptno;SELECT deptno,LISTAGG(ename, ',') WITHIN GROUP() AS employeesFROM scott.empGROUP BY deptnoORA-30491: ORDER BY 子句缺失SQL> SELECT deptno,2 LISTAGG(ename, ',') WITHIN GROUP(order by null) AS employees3 FROM scott.emp4 GROUP BY deptno;DEPTNO EMPLOYEES------ --------------------------------------------------------------------------------10 CLARK,KING,MILLER20 ADAMS,FORD,JONES,SCOTT,SMITH30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD==〉按字母顺序排列4,LISTAGG作为分析函数使用SQL> SELECT empno,2 ename,3 deptno,4 LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) over(partition by deptno) AS employees5 FROM scott.emp;EMPNO ENAME DEPTNO EMPLOYEES----- ---------- ------ --------------------------------------------------------------------------------7782 CLARK 10 CLARK,KING,MILLER7839 KING 10 CLARK,KING,MILLER7934 MILLER 10 CLARK,KING,MILLER7876 ADAMS 20 ADAMS,FORD,JONES,SCOTT,SMITH7902 FORD 20 ADAMS,FORD,JONES,SCOTT,SMITH7566 JONES 20 ADAMS,FORD,JONES,SCOTT,SMITH7788 SCOTT 20 ADAMS,FORD,JONES,SCOTT,SMITH7369 SMITH 20 ADAMS,FORD,JONES,SCOTT,SMITH7499 ALLEN 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD7698 BLAKE 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD7900 JAMES 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD7654 MARTIN 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD7844 TURNER 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD7521 WARD 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD14 rows selected5,其他实现方法参考--modelSQL> SELECT deptno, vals2 FROM (SELECT deptno, RTRIM(vals, ',') AS vals, rn3 FROM scott.emp MODEL PARTITION BY(deptno) DIMENSION BY(ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY ename) AS rn) MEASURES(CAST(ename AS VARCHAR2(4000)) AS vals) RULES(vals [ ANY ] ORDER BY rn DESC = vals [ CV() ] || ',' || vals [ CV() + 1 ]))4 WHERE rn = 15 ORDER BY deptno;DEPTNO VALS---------- --------------------------------------------------------------------------------10 CLARK,KING,MILLER20 ADAMS,FORD,JONES,SCOTT,SMITH30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD--表函数:WMSYS.WM_CONCAT,10G已经提供该函数SQL> SQL> SELECT deptno, WMSYS.WM_CONCAT(ename) AS vals --<-- WM_CONCAT ~= STRAGG2 FROM scott.emp3 GROUP BY deptno;DEPTNO VALS------ --------------------------------------------------------------------------------10 CLARK,MILLER,KING20 SMITH,FORD,ADAMS,SCOTT,JONES30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD