Oracle Oracle去重分組拼接字串

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

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

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避免不匹配項被更新為空值。

鍊錶去重 25 分

給定乙個帶整數鍵值的鍊錶 l,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 k,只有第乙個絕對值等於 k 的結點被保留。同時,所有被刪除的結點須被儲存在另乙個鍊錶上。例如給定 l 為 21 15 15 7 15,你需要輸出去重後的鍊錶 21 15 7,還有被刪除的鍊錶 15 15。輸入在第一行...

count去重和distinct去重

有兩種去重方法 1 select count distinct id from a 這個是將所有值都放入到記憶體中,key為列值,通過hash算出有多少個key就是多少行。2 select count 1 from select 1 from a group by id a,這個是通過group b...

JS陣列去重,物件去重

例項1根據indexof去重,indexof的好處就是返回的是首次出現的位置,這樣後面即使出現的值一樣,也只能返回第一次出現的索引,當然這個只適用於簡單的陣列 物件陣列去重 const objarr const obj const newobjarr for let i 0 i objarr.len...