oracle-wm_concat函数与LISTAGG函数(合并列值)

select * from DEMO.TEST;
IDNAMEAGEADDRES
1cx1湖北
1cx1湖北
1cx0.1湖北
1cx0.1湖北
1cx11湖北
1cx21湖北
1cx10.1湖北
1cx20.1湖北
1cx1湖南
1cx1长沙
1cx0.1上海
1cx0.1长沙
1cx11湖南
1cx21上海
1cx10.1长沙
1cx20.1上海
  • wm_concat(列名)函数:该函数可以把列值以”,“逗号分隔起来,并显示成一行;
select id,name,age,REPLACE(wm_concat(address), ',', ';') from DEMO.TEST group by id,name,age;
IDNAMEAGEREPLACE(WM_CONCAT(ADDRESS),‘,’,‘;’)
1cx0.1湖北;长沙;上海;湖北
1cx1湖北;长沙;湖南;湖北
1cx10.1湖北;长沙
1cx11湖北;湖南
1cx20.1湖北;上海
1cx21湖北;上海

看似好像没有什么问题,现在我们来将number 类型的合并一下:

IDNAMEADDRESSREPLACE(WM_CONCAT(AGE),‘,’,‘;’)
1cx长沙1;.1
1cx湖北1;.1;.1;1
1cx湖南1
1cx上海.1
1cx1长沙.1
1cx1湖北1;.1
1cx1湖南1
1cx2湖北1;.1
1cx2上海1;.1
发现端倪了,在number类型转换成varchar类型时, .前面的0会被自动省略掉.此时我们需要对参数做一下判断:
select id,name,address,REPLACE(wm_concat(nvl(nullif(substr(to_char(age),0,1),'.'),'0'||to_char(age))), ',', ';') from DEMO.TEST group by id,name,address;
IDNAMEADDRESSREPLACE(WM_CONCAT(NVL(NULLIF(SUBSTR(TO_CHAR(AGE),0,1),‘.’),‘0’\\TO_CHAR(AGE))),‘,’,‘;’)
1cx长沙1;0.1
1cx湖北1;0.1;0.1;1
1cx湖南1
1cx上海0.1
1cx1长沙0.1
1cx1湖北1;0.1
1cx1湖南1
1cx2湖北1;0.1
1cx2上海1;0.1

可以看出上述经过合并后,并没有排序,此时可以用另外一个与其有相似功能的函数LISTAGG:

SELECT id,name,address,LISTAGG(nvl(nullif(substr(to_char(age),0,1),'.'),'0'||to_char(age)),',') WITHIN GROUP(ORDER BY age) AS columns
FROM DEMO.TEST
group by id,name,address;

IDNAMEADDRESSCOLUMNS
1cx长沙0.1,1
1cx湖北0.1,0.1,1,1
1cx湖南1
1cx上海0.1
1cx1长沙0.1
1cx1湖北0.1,1
1cx1湖南1
1cx2湖北0.1,1
1cx2上海0.1,1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈行恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值