資源描述:
《oracle多行記錄合并連接聚合字符串的幾種方法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、Oracle多行記錄合并連接聚合字符串的幾種方法怎么合并多行記錄的字符串,一直是oracle新手喜歡問(wèn)的SQL問(wèn)題之一,關(guān)于這個(gè)問(wèn)題的帖子我看過(guò)不下30個(gè)了,現(xiàn)在就對(duì)這個(gè)問(wèn)題,進(jìn)行一個(gè)總結(jié)。什么是合并多行字符串(連接字符串)呢,例如:SQL>desctest;NameTypeNullableDefaultComments------------------------------------------COUNTRYVARCHAR2(20)YCITYVARCHAR2(20)YSQL>select*fromtest;COU
2、NTRYCITY----------------------------------------中國(guó)臺(tái)北中國(guó)香港中國(guó)上海日本東京日本大阪要求得到如下結(jié)果集:---------------------------中國(guó)臺(tái)北,香港,上海日本東京,大阪實(shí)際就是對(duì)字符實(shí)現(xiàn)一個(gè)聚合功能,我很奇怪為什么Oracle沒(méi)有提供官方的聚合函數(shù)來(lái)實(shí)現(xiàn)它呢:)下面就對(duì)幾種經(jīng)常提及的解決方案進(jìn)行分析(有一個(gè)評(píng)測(cè)標(biāo)準(zhǔn)最高★★★★★):1.被集合字段范圍小且固定型靈活性★性能★★★★難度★這種方法的原理在于你已經(jīng)知道CITY字段的值有幾種,且還不算太
3、多,如果太多這個(gè)SQL就會(huì)相當(dāng)?shù)拈L(zhǎng)。??蠢樱篠QL>selectt.country,2MAX(decode(t.city,'臺(tái)北',t.city
4、
5、',',NULL))
6、
7、3MAX(decode(t.city,'香港',t.city
8、
9、',',NULL))
10、
11、4MAX(decode(t.city,'上海',t.city
12、
13、',',NULL))
14、
15、5MAX(decode(t.city,'東京',t.city
16、
17、',',NULL))
18、
19、6MAX(decode(t.city,'大阪',t.city
20、
21、',',NULL))7f
22、romtesttGROUPBYt.country8/COUNTRYMAX(DECODE(T.CITY,'臺(tái)北',T.CIT--------------------------------------------------中國(guó)臺(tái)北,香港,上海,日本東京,大阪,大家一看,估計(jì)就明白了(如果不明白,好好補(bǔ)習(xí)MAXDECODE和分組)。這種方法無(wú)愧為最笨的方法,但是對(duì)某些應(yīng)用來(lái)說(shuō),最有效的方法也許就是它。2.固定表固定字段函數(shù)法靈活性★★性能★★★★難度★★此法必須預(yù)先知道是哪個(gè)表,也就是說(shuō)一個(gè)表就得寫一個(gè)函數(shù),不過(guò)方法1的一
23、個(gè)取值就要便捷多了。在大多數(shù)應(yīng)用中,也不會(huì)存在大量這種合并字符串的需求。廢話完畢,看下面:定義一個(gè)函數(shù)createorreplacefunctionstr_list(str_ininvarchar2)--分類字段returnvarchar2isstr_listvarchar2(4000)defaultnull;--連接后字符串strvarchar2(20)defaultnull;--連接符號(hào)beginforxin(selectTEST.CITYfromTESTwhereTEST.COUNTRY=str_in)loopst
24、r_list:=str_list
25、
26、str
27、
28、to_char(x.city);str:=',';endloop;returnstr_list;end;使用:SQL>selectDISTINCT(T.country),list_func1(t.country)fromtestt;COUNTRYLIST_FUNC1(T.COUNTRY)------------------------------------中國(guó)臺(tái)北,香港,上海日本東京,大阪SQL>selectt.country,str_list(t.country)from
29、testtGROUPBYt.country;COUNTRYSTR_LIST(T.COUNTRY)-------------------------------------------中國(guó)臺(tái)北,香港,上海日本東京,大阪這個(gè)時(shí)候,使用分組和求唯一都可以滿足要求。它的原理就是,根據(jù)唯一的分組字段country,在函數(shù)里面再次查詢?cè)撟侄螌?duì)應(yīng)的所有被合并列,使用PL/SQL將其合并輸出。3.靈活表函數(shù)法靈活性★★★性能★★★難度★★★該方法是在方法2的基礎(chǔ)上,使用動(dòng)態(tài)SQL,將表名和字段名稱傳入,從而達(dá)到靈活的目的。createo
30、rreplacefunctionstr_list2(key_nameinvarchar2,keyinvarchar2,conameinvarchar2,tnameinvarchar2)returnvarchar2astypercisrefcursor;strvarchar2(4000);sepvarchar2(2);