xmlagg、listagg、wm_concat三个函数在oracle中都可以用于列转换行

查询例子:
将fileorgname字段用,分隔的数据,实现列转行
sql select t.fileorgname, t.typepath3 from t_imgfileindex t
在这里插入图片描述

一、xmlagg

效果和wm_concat一样,但是性能不一样,xmlagg排序一下,性能会快一些。

--语法:
1. xmlagg(xmlparse(content 合并字段 ||,’ wellformed) order by 排序字段).getclobval()

例子:
select xmlagg(xmlparse(content t.fileorgname || ',' wellformed) order by t.typepath3)
       .getclobval() as fileorgname,
       t.typepath3
  from t_imgfileindex t
 group by t.typepath3;

在这里插入图片描述

--语法:
2. xmlagg(xmlelement(e, 合并字段, ',').extract('//text()')).getclobval()

例子:
select xmlagg(xmlelement(e, t.fileorgname, ',').extract('//text()'))
       .getclobval() as fileorgname,
       t.typepath3
  from t_imgfileindex t
 group by t.typepath3;

在这里插入图片描述

二、listagg

11g2才提供的函数,不支持distinct,拼接长度不能大于4000,函数返回为varchar2类型,最大长度为4000。当查询较慢时,建议使用listagg代替wm_concat。

--语法:
listagg( 合并字段, ',') within group (order by 排序字段 )

例子:
select listagg(t.fileorgname, ',') within group(order by t.typepath3) as fileorgname,
       t.typepath3
  from t_imgfileindex t
 group by t.typepath3;

在这里插入图片描述

三、wm_concat

wm_concat依赖WMSYS 用户,不同oracle环境时可能用不了,会有版本不兼容问题,返回类型为CLOB,可用substr截取长度后to_char转化为字符类型。

--语法:
wm_concat()

例子:
select wm_concat(distinct t.fileorgname),
       t.typepath3
  from t_imgfileindex t;

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐