在Oracle中使用wm_concat(column)可以實現字段的分組合並,逗號分隔。
例如,現有表temp_cwh_test:
-- 創建臨時表
create table temp_cwh_test ( u_id varchar(10), goods varchar(32), num number(5) ) -- 插入數據
insert into temp_cwh_test(u_id, goods, num) values('1','蘋果',2); insert into temp_cwh_test(u_id, goods, num) values('2','梨子',5); insert into temp_cwh_test(u_id, goods, num) values('1','西瓜',4); insert into temp_cwh_test(u_id, goods, num) values('3','葡萄',1); insert into temp_cwh_test(u_id, goods, num) values('3','香蕉',1); insert into temp_cwh_test(u_id, goods, num) values('1','橘子',3); -- 查看表
select * from temp_cwh_test;
1.想按u_id分組,進行goods合並
-- 使用wm_concat函數實現字段合並
select u_id,wm_concat(goods) goods_sum from temp_cwh_test group by u_id;
得到:
2.想按u_id分組,進行goods和num合並
select u_id,wm_concat(goods ||'(' || num ||'斤)') goods_sum from temp_cwh_test group by u_id;
得到:
3.以“|”進行分隔合並
select u_id, replace(wm_concat(goods),',','|') as goods_sum from temp_cwh_test group by u_id
得到:
4.其他
Oracle 11g后,推薦使用listagg函數。
-- 該函數不是oracle公開的系統函數,它的用戶是wmsys,而不是sys或者system,oracle很有可能在版本升級或者補丁的時候取消或者修改這個函數甚至用戶,這種變化oracle是不會公開的。所有可能會由於這個變化而導致異常。
-- 大量使用這個函數也會導致臨時表空間爆滿,這是因為在10.2.0.5中,使用wmsys.wm_concat返回的結果格式是CLOB,CLOB占用的臨時表空間只有在連接釋放后才會釋放,部分通過連接池連接數據庫的長連接很有可能導致CLOB占用臨時表空間不斷累積增大,會導致臨時表空間爆滿的故障。
-- 如果是在程序中大量使用這個函數的話會引起enq:TT的鎖,可能會導致某些對象被鎖。
END 2018-11-04 01:20:40