提示:以下是本篇文章正文内容,下面案例可供参考
一、数据准备
创建表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
不行。