1. 程式人生 > >Oracle學習筆記:wm_concat函式合併欄位

Oracle學習筆記:wm_concat函式合併欄位

  在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