
解决方案
通过自定义函数解决也是可以的,不过我并不是这样做的。 下面介绍一下我的解决方法。首先分析一下,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>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)