千家信息网

oracle中多列转行

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,方式一 : 通过wm_concat函数,该函数在10g可以使用,11g 中不兼容,12g中去掉了该函数, ,返回类型为varchar语法:wm_concat(列)例子:Select wm_concat
千家信息网最后更新 2024年11月26日oracle中多列转行

方式一 通过wm_concat函数,该函数在10g可以使用,11g 中不兼容,12g中去掉了该函数, ,返回类型为varchar

语法:wm_concat(列)

例子:Select wm_concat(Rownum) From dual Connect By Rownum < 10;

优点:语法简单

缺点:字符长度不能超过4000,以逗号分隔,如果要以其他符号分割,还要替换,性能比较差


方式二:通过lisagg 返回类型为varchar

语法: listagg(参数,'分隔符') within group(order by 参数id)

例子:Select

listagg(Rownum,';') Within group(Order By Rownum Desc)

From dual Connect By Rownum < 10;

优点:可以排序,并且可以自定义分隔符,效率也高

缺点:拼接字符长度不能超过4000

方式三:通过xmlagg,是解析MXL用的,也可以用作字符拼接,返回clob类型

语法:
XMLAGG(XMLPARSE(CONTENT 字段 || 分隔符 WELLFORMED) ORDER BY 字段).GETCLOBVAL()

XMLAGG(XMLELEMENT(e, 字符串 , 分隔符).Extract('//text()')).GETCLOBVAL()
例子:

可以使用下面两种之一:

Select Xmlagg(Xmlparse(Content Rownum || ',' Wellformed) Order By Rownum Desc)

.Getclobval()

From Dual

Connect By Rownum < 30000;

Select Xmlagg(Xmlelement(e, Rownum, ',').Extract('//text()')).Getclobval()

From Dual

Connect By Rownum < 30;

优点:对字符拼接没有长度限制

缺点:语法比较复杂


0