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

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

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

ID NAME ADDRESS REPLACE(WM_CONCAT(AGE),‘,’,‘;’)
1 cx 长沙 1;.1
1 cx 湖北 1;.1;.1;1
1 cx 湖南 1
1 cx 上海 .1
1 cx1 长沙 .1
1 cx1 湖北 1;.1
1 cx1 湖南 1
1 cx2 湖北 1;.1
1 cx2 上海 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;
ID NAME ADDRESS REPLACE(WM_CONCAT(NVL(NULLIF(SUBSTR(TO_CHAR(AGE),0,1),‘.’),‘0’\\TO_CHAR(AGE))),‘,’,‘;’)
1 cx 长沙 1;0.1
1 cx 湖北 1;0.1;0.1;1
1 cx 湖南 1
1 cx 上海 0.1
1 cx1 长沙 0.1
1 cx1 湖北 1;0.1
1 cx1 湖南 1
1 cx2 湖北 1;0.1
1 cx2 上海 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;

ID NAME ADDRESS COLUMNS
1 cx 长沙 0.1,1
1 cx 湖北 0.1,0.1,1,1
1 cx 湖南 1
1 cx 上海 0.1
1 cx1 长沙 0.1
1 cx1 湖北 0.1,1
1 cx1 湖南 1
1 cx2 湖北 0.1,1
1 cx2 上海 0.1,1

猜你喜欢

转载自blog.csdn.net/m0_56981185/article/details/126464190