Oracle vm_concat()和listagg()函数使用

本文介绍了在Oracle数据库中,如何使用vm_concat和listagg函数将从表的多列数据转换为一行。vm_concat在不同版本可能返回不同类型,可能会导致报错,而listagg能稳定地按指定分隔符合并列并排序。当从表无数据时,vm_concat会返回CLOB类型引发错误,此时可以改用listagg来解决该问题。

在实际工作当中,有很多主从关系表需要在一个列表展示成一行数据,从表数据多列转成一行。vm_contact()和listagg()函数都能实现列转行功能。

1、vm_concat使用情况:

根据主表ID,查询从表ID列

select t.id,wm_concat(t1.id) as detailsId
from t_test t
left join t_test_detail t1 on t.id = t1.set_id
group by t.id

返回结果,在oracle11g中返回clob类型,在oracle10g中返回varchar型。我本机装的11g,上面这种写法就直接报错。

 转成to_char正常页面正常。


select t.id,to_char(wm_concat(t1.id)) as detailsId
from t_test t
left join t_test_detail t1 on t.id = t1.set_id
group by t.id

运行结果

2、listagg使用

LISTAGG(Item_Name, ',') WITHIN GROUP(ORDER BY Item_Name)  -- 将 Item_Name 列的内容以", "进行分割合并、排序;

实例:

select t.id,listagg(t1.id,',')within group(order by t1.id) as detailsId
from t_test t
left join t_test_detail t1 on t.id = t1.set_id
group by t.id

运行结果

---------------------------------------------------分割线------------------------------------------------------- 

在实际应用中,联查表的时候用vm_contact(),从表没有数据时,转成clob类型报错。报错如下

最后将vm_contract()改成listagg()解决问题,特此记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值