Oracle函数5—列转行(wm_concat、listagg)

本文介绍了在Oracle数据库中,listagg()和wm_concat两个函数在数据准备中的使用方法,包括排序拼接、多列拼接以及性能对比。listagg()推荐用于效率较高的场景,而wm_concat适用于字段长度较短且可能需要去重的情况。
摘要由CSDN通过智能技术生成


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据准备

创建表GradesTable

CREATE TABLE GradesTable (Name VARCHAR2(6), Languages VARCHAR2(6),Mathematics VARCHAR2(6), English VARCHAR2(6) );
insert into GradesTable (Name,Languages,Mathematics,English) values('李明','88','67','98');
insert into GradesTable (Name,Languages,Mathematics,English) values('阿珂','88','67','98');
insert into GradesTable (Name,Languages,Mathematics,English) values('唐三','88','67','98');

二、函数使用

1.listagg()

对列数据排序拼接,如果需要不排序order by 后的字段可为null

--排序
select listagg(Name) within GROUP (ORDER BY Name) from GradesTable;
--执行结果:阿珂李明唐三

--不排序
select listagg(Name) within GROUP (ORDER BY null) from GradesTable;
--执行结果:李明阿珂唐三

对列数据进行排序后,再用指定字符分割拼接

select listagg(Name,'-') within GROUP (ORDER BY Name) from GradesTable;
--执行结果:阿珂-李明-唐三

2.wm_concat

  • 也可以写成wmsys.wm_concat

  • 括号里面的参数是列,而且可以是多个列的集合,也就是说在括号里面可以自由地用‘||’合并字符串;

  • 拼接结果会用逗号分隔显示。

-- 拼接单个列
select wm_concat(Name) from GradesTable;
执行结果:李明,阿珂,唐三

-- 拼接多个列
select wm_concat(Name||'-'||Languages) from GradesTable;
执行结果:李明-88,阿珂-88,唐三-88

提示:拼接后字符串长度如果超过4000,会发生报错SQL :[22813] [99999]: ORA-22813: 操作数值超出系统的限制,所以只适合小长度拼接


总结

wm_concat效率较低,优先推荐使用listagg

wm_concat适合字段长度较短时使用;

wm_concat可以结合distinct函数对拼接结果直接进行去重,但是listagg不行。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值