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 |