Oracle vm_concat()和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()解决问题,特此记录。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值