Oracle列转行函数vm_concat在19C版本不兼容解决方案

Oracle列转行函数vm_concat在19C版本不兼容解决方案,第1张

        本文记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的。不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好。这个函数在Oracle12C是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用。最近开发场景遇到这个问题,可以写到了自定义列转行函数的办法去解决。但是这种办法并不一定适用所有的业务场景。

解决方案

        通过自定义函数解决也是可以的,不过我并不是这样做的。 下面介绍一下我的解决方法。首先分析一下,Oracle19C不兼容vm_concat列转行函数,并不代表其它函数不兼容,或许可以找到其它代替的,通过找资料,发现了Oracle11提供的另外一个函数:listagg()函数 语法:listagg(参数,‘分隔符’) within group(order by 参数id),验证可以实现在19C正常使用

例如:

to_char(wm_concat(t.busi_id))

可以改写成:

to_char(listagg(t.busi_id,',' ) within GROUP (order by (t.busi_id)))

SQL如:

SELECT listagg(t.busi_id, ',') within GROUP(order by (t.busi_id))

  FROM sys_cdc_sync_record t

WHERE cdc_sql_type = 'INSERT_SELECT'

XMLAGG函数语法基本如图,可以用于列转行,列转行函数在oracle里有好几种方法,wm_concat也可以做

这里介绍wm_concat是因为 XMLAGG实现效果和wm_concat是一样的,只是性能方面不一样,注意:XMLAGG最好排序一下,性能会好点

XMLAGG例子:

需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式。这就想到oracle的列转行函数。 可以用类似这种格式(a || '(' || b || ')'),a表示用户名字段,b表示账号字段。

查询出来,是用,分隔的数据,实现列转行显示

XMLAGG常用语法:

wm_concat会有版本不兼容问题, https://blog.csdn.net/u014427391/article/details/84867390

oracle列转行函数还有listagg,也可以用sys_connect_by_path来做,具体根据需求来

SQL>create table t (a number, b varchar2(10))

表已创建。

SQL>insert into t values(1,'A')

已创建 1 行。

SQL>insert into t values(1,'B')

已创建 1 行。

SQL>insert into t values(2,'A')

已创建 1 行。

SQL>insert into t values(2,'B')

已创建 1 行。

SQL>insert into t values(3,'C')

已创建 1 行。

SQL>insert into t values(3,'F')

已创建 1 行。

SQL>insert into t values(4,'D')

已创建 1 行。

SQL>commit

提交完成。

SQL>select a,max(decode(c,1,b,null)),

2 max(decode(c,2,b,null)),

3 max(decode(c,3,b,null))

4 from(select a,b,row_number()over(partition by a order by b ) c from t)

5* group by a

SQL>/

A MAX(DECODE MAX(DECODE MAX(DECODE

---------- ---------- ---------- ----------

1 A B

2 A B

3 C F

4 D

SQL>


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9783631.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存