Oracle Oracle去重分組拼接字串

2022-08-05 16:33:11 字數 2208 閱讀 2623

要實現的是去重按順序分組拼接欄位,且輸出表中需要拼接多個欄位。

1、查了網上大概有四種方法,各有特點:

1、wmsys.wm_concat(column)

2、listagg (column,[,]) within group (order by ) [over (partition by )]

3、sys_connect_by_path(column,《分隔符》)

4、xmlagg (content column,[,] wellformed) within group (order by ) [over (partition by )]

第1種,wmsys使用者用於workspace manager,函式物件可能因版本而不同,oracle官方也不建議使用;不可指定分隔符;支援去重。

第2種,listagg返回結果varchar2型別(最大長度4000),當拼接字串過長會提示“返回結果為字串連線的結果過長”;可指定分隔符;不支援去重。

第3種,此方法未測試。

第4種,返回結果為clob(character large object)型別,最大容量為4gb;可指定分隔符;不支援去重。

2、確定了使用第4種方法,發現實現難點在於分組結果去重,又存在多個欄位需要拼接,則先去重只可針對一個欄位,多個欄位就存在問題,採用先產生針對不同欄位拼接的臨時表,使用分組欄位作為連線更新到主表中。

網上針對xmlagg可使用的去重方法有兩種,一種是使用正規表示式(適用於字串大小比較小的情況,不適用),另一種是先去重再聚合。

create global temporary table d302_2 on commit preserve rows as

select sheng,

xian,

xmmc,

bhyy,

bhsd,

syldxz,

rtrim(xmlagg(xmlparse(content pan_no_tb || '、' wellformed) order by pan_no_tb).getclobval(),

'、') as pan_no_tb

from (select distinct sheng, xian, xmmc, bhyy, bhsd, syldxz, pan_no_tb

from test

where pan_no_tb <> 0)

group by sheng, xian, xmmc, bhyy, bhsd, syldxz;

from 後面括號內實現去重目的

group by 實現分組目的

xmlagg(xmlparse(content pan_no_tb || '、' wellformed) order by pan_no_tb) 實現拼接

getclobval() 獲得clob字串

rtrim 去除最後面的 ""

注意:xmlagg欄位若為字串,需適應to_char()函式轉換。

3、使用分組欄位作為連線更新到主表中(a2,a3,a7,a8,a9,a10分別為主表的sheng, xian, xmmc, bhyy, bhsd, syldxz)

update d302_1

set d302_1.a5 =

(select pan_no_tb

from d302_3

where d302_3.sheng = d302_1.a2

and d302_3.xian = d302_1.a3

and d302_3.xmmc = d302_1.a7

and d302_3.bhyy = d302_1.a8

and d302_3.bhsd = d302_1.a9

and d302_3.syldxz = d302_1.a10)

where exists (select pan_no_tb

from d302_3

where d302_3.sheng = d302_1.a2

and d302_3.xian = d302_1.a3

and d302_3.xmmc = d302_1.a7

and d302_3.bhyy = d302_1.a8

and d302_3.bhsd = d302_1.a9

and d302_3.syldxz = d302_1.a10);

where exists避免不匹配項被更新為空值。