SELECT regexp_substr('公司1,贵公司2', '[^,]+', 1, LEVEL, 'i')
FROM dual
CONNECT 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 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

2,测试数据
SQL> 
SQL> select empno,ename,deptno from scott.emp;

EMPNO ENAME DEPTNO
----- ---------- ------
7369 SMITH 20
7499 ALLEN 30
7521 WARD 30
7566 JONES 20
7654 MARTIN 30
7698 BLAKE 30
7782 CLARK 10
7788 SCOTT 20
7839 KING 10
7844 TURNER 30
7876 ADAMS 20
7900 JAMES 30
7902 FORD 20
7934 MILLER 10

14 rows selected

3,作为聚集函数
SQL> SELECT deptno,
2 LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees
3 FROM scott.emp
4 GROUP BY deptno;

DEPTNO EMPLOYEES
------ --------------------------------------------------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

SQL> 
--更换排序列
SQL> SELECT deptno,
2 LISTAGG(ename, ',') WITHIN GROUP(ORDER BY hiredate) AS employees
3 FROM scott.emp
4 GROUP BY deptno;

DEPTNO EMPLOYEES
------ --------------------------------------------------------------------------------
10 CLARK,KING,MILLER
20 SMITH,JONES,FORD,SCOTT,ADAMS
30 ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES
--order by必须存在
SQL> SELECT deptno,
2 LISTAGG(ename, ',') WITHIN GROUP() AS employees
3 FROM scott.emp
4 GROUP BY deptno;

SELECT deptno,
LISTAGG(ename, ',') WITHIN GROUP() AS employees
FROM scott.emp
GROUP BY deptno

ORA-30491: ORDER BY 子句缺失

SQL> SELECT deptno,
2 LISTAGG(ename, ',') WITHIN GROUP(order by null) AS employees
3 FROM scott.emp
4 GROUP BY deptno;

DEPTNO EMPLOYEES
------ --------------------------------------------------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 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 employees
5 FROM scott.emp;

EMPNO ENAME DEPTNO EMPLOYEES
----- ---------- ------ --------------------------------------------------------------------------------
7782 CLARK 10 CLARK,KING,MILLER
7839 KING 10 CLARK,KING,MILLER
7934 MILLER 10 CLARK,KING,MILLER
7876 ADAMS 20 ADAMS,FORD,JONES,SCOTT,SMITH
7902 FORD 20 ADAMS,FORD,JONES,SCOTT,SMITH
7566 JONES 20 ADAMS,FORD,JONES,SCOTT,SMITH
7788 SCOTT 20 ADAMS,FORD,JONES,SCOTT,SMITH
7369 SMITH 20 ADAMS,FORD,JONES,SCOTT,SMITH
7499 ALLEN 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
7698 BLAKE 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
7900 JAMES 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
7654 MARTIN 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
7844 TURNER 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
7521 WARD 30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

14 rows selected
5,其他实现方法参考
--model
SQL> SELECT deptno, vals
2 FROM (SELECT deptno, RTRIM(vals, ',') AS vals, rn
3 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 = 1
5 ORDER BY deptno;

DEPTNO VALS
---------- --------------------------------------------------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

--表函数:WMSYS.WM_CONCAT,10G已经提供该函数
SQL> 
SQL> SELECT deptno, WMSYS.WM_CONCAT(ename) AS vals --<-- WM_CONCAT ~= STRAGG
2 FROM scott.emp
3 GROUP BY deptno;

DEPTNO VALS
------ --------------------------------------------------------------------------------
10 CLARK,MILLER,KING
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD

转载于:https://www.cnblogs.com/toowang/p/3491139.html

Oracle11.2新特性之listagg函数 (行列转换)相关推荐

  1. C++11新特性之defaulted函数

    背景 C++在类中有几个比较特殊的成员函数,如默认构造函数,析构函数等.如果程序员没有显式的定义一个特殊成员函数,在程序需要用到这些特殊成员函数时,编译器会隐式的为这个类生成一个默认的成员特殊函数. ...

  2. 12C 新特性 | 标量子查询自动转换

    有超过6年超大型数据库专业服务经验,擅长数据库解决方案设计与项目管理:在多年的技术实践中,先后为运营商(移动.电信).银行.保险.制造业等各行业客户的业务关键型系统提供了运维.升级.性能优化.项目实施 ...

  3. SQL ON Hadoop-Hive(六)-字符串函数+行列转换

    一.hive常用字符串函数 1.字符串反转函数reverse(string A) --返回值类型stringselect reverse('gian') from iteblog; --'naig'2 ...

  4. ES6新特性3:函数的扩展

    本文摘自ECMAScript6入门,转载请注明出处. 一.函数参数默认值 1. ES6允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') ...

  5. 实战 es6_Node.JS实战65:ES6新特性:箭头函数

    有人说ES6(ES2015)最具魅力的是箭头函数.但真的,我不这么认为:箭头函数这玩意真是又丑又变扭! 不过,箭头函数确实有它的功能优势: 1.简洁: (虽然我也不认为这是真的简洁,还是认为它是很变扭 ...

  6. ES6新特性之箭头函数

    概述:ES6允许使用箭头(=>)定义函数,箭头函数提供了一种更加简洁的函数书写方式,箭头函数多用于匿名函数的定义: 箭头函数的注意点 如果形参只有一个,则小括号可以省略 函数体如果只有一条语句, ...

  7. ES6新特性之Generator函数

    Generator函数 Generator 函数是 ES6 提供的 一种异步编程解决方案,语法行为与传统函数完全不同 . Generator函数有两个特征: 一是 function命令与函数名 之间有 ...

  8. ES6新特性_ES6生成器函数实例_第二个实例---JavaScript_ECMAScript_ES6-ES11新特性工作笔记023

    然后我们再来看一个案例 这里我们说生成器函数是针对异步编程的解决方案,我们看看他是怎么解决的, 我们知道这个setTimeout是异步执行的,那么 我们这里现在有这样一个需求,我们先拿到某个用户数据, ...

  9. ES6新特性_ES6生成器函数实例---JavaScript_ECMAScript_ES6-ES11新特性工作笔记022

    生成器函数是针对异步编程的一个解决方案 我们知道ajax,是异步的,其实 文件操作,网络操作,数据库操作,都是异步的 我们这里做个例子就是1s后输出111,2s后输出222,3s后输出333,可以用上 ...

最新文章

  1. 高达82 fps的实时文本检测,可微分二值化模块
  2. java--内存管理的几点小技巧
  3. jquery单选框radio绑定click事件实现和是否选中的方法
  4. (转)linux内核虚拟文件系统浅析
  5. Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库...
  6. 拒绝CPU挖矿矿工有责
  7. [BZOJ 3173] [TJOI 2013] 最长上升子序列(splay)
  8. 办公网络对工业交换机的功能要求
  9. 原创 | 为什么阿里巴巴建议开发者谨慎使用继承?
  10. PHP从千千静听服务器获取lrc歌词
  11. window下环境变量立即生效
  12. android怎么改名字,手把手教你如何修改安卓软件的图标和名字
  13. android地球经纬度平面图,地球经纬度划分图高清 怎么划分经纬度
  14. autoCAD恐吓式销售_恐吓式软文的例子 恐吓式软文营销案例分享
  15. 《富爸爸穷爸爸》读书笔记
  16. struct+Matlab向上向下取整+单位圆向量+matlab求导
  17. 前端面试题:如何画一条0.5px的线
  18. 前端程序员拿到新电脑第一天,该做些什么?
  19. edg击败we视频_2017LPL春季赛4月8日WE VS EDG视频:EDG 2:0 WE获胜
  20. 申诉解决TeamViewer免费个人版被误判为商业使用

热门文章

  1. 这个美国议员候选人想发币,联邦选举委员会还答应了
  2. 基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷
  3. java线程池的工作原理_Java 线程池的介绍以及工作原理
  4. java struts技术_java技术框架之:struts
  5. 参加完Python培训可以做什么
  6. APP自动化测试过程概述
  7. Python入门学习方法有哪些?
  8. 零基础参加java培训如何学习
  9. ActiveMQ快速入门
  10. Android屏幕适配框架-(今日头条终极适配方案)