亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle多行記錄字符串綜合操作幾種方法

2024-08-29 13:49:31
字體:
來源:轉載
供稿:網友
怎么合并多行記錄的字符串,一直是Oracle新手喜歡問的SQL問題之一,關于這個問題的帖子我看過不下30個了,現在就對這個問題,進行一個總結。 合并 什么是合并多行字符串(連接字符串)呢,例如:
SQL> desc test;Name Type Nullable Default Comments ------- ------------ -------- ------- -------- COUNTRY VARCHAR2(20) Y CITY VARCHAR2(20) Y SQL> select * from test;COUNTRY CITY-------------------- --------------------中國 臺北中國 香港中國 上海日本 東京日本 大阪要求得到如下結果集:------- --------------------中國 臺北,香港,上海 日本 東京,大阪
實際就是對字符實現一個聚合功能。 下面就對幾種經常提及的解決方案進行分析(有一個評測標準最高★★★★★): 1.被集合字段范圍小且固定型: 靈活性★ 性能★★★★ 難度 ★ 這種方法的原理在于你已經知道CITY字段的值有幾種,且還不算太多,假如太多這個SQL就會相當的長??蠢樱?
SQL> select t.country, 2 MAX(decode(t.city,'臺北',t.city',',NULL)) 3 MAX(decode(t.city,'香港',t.city',',NULL)) 4 MAX(decode(t.city,'上海',t.city',',NULL)) 5 MAX(decode(t.city,'東京',t.city',',NULL)) 6 MAX(decode(t.city,'大阪',t.city',',NULL)) 7 from test t GROUP BY t.country 8 /COUNTRY MAX(DECODE(T.CITY,'臺北',T.CIT-------------------- ------------------------------中國 臺北,香港,上海, 日本 東京,大阪,
大家一看,估計就明白了(假如不明白,好好補習MAX DECODE和分組)。這種方法無愧為最笨的方法,但是對某些應用來說,最有效的方法也許就是它。 2.固定表固定字段函數法: 靈活性★★ 性能★★★★ 難度 ★★ 此法必須預先知道是哪個表,也就是說一個表就得寫一個函數,不過方法1的一個取值就要便捷多了。在大多數應用中,也不會存在大量這種合并字符串的需求。廢話完畢,看下面: 定義一個函數:
create or replace function str_list( str_in in varchar2 )--分類字段return varchar2 isstr_list varchar2(4000) default null;--連接后字符串str varchar2(20) default null;--連接符號beginfor x in ( select TEST.CITY from TEST where TEST.COUNTRY = str_in ) loopstr_list := str_list str to_char(x.city);str := ', ';end loop;return str_list; end;
  使用:
SQL> select DISTINCT(T.country),list_func1(t.country) from test t;COUNTRY LIST_FUNC1(T.COUNTRY)-------------------- ----------------中國 臺北, 香港, 上海日本 東京, 大阪SQL> select t.country,str_list(t.country) from test t GROUP BY t.country;COUNTRY STR_LIST(T.COUNTRY)-------------------- -----------------------中國 臺北, 香港, 上海 日本 東京, 大阪
這個時候,使用分組和求唯一都可以滿足要求。它的原理就是,根據唯一的分組字段country,在函數里面再次查詢該字段對應的所有被合并列,使用PL/SQL將其合并輸出。
3.靈活表函數法 靈活性★★★ 性能★★★ 難度 ★★★ 該方法是在方法2的基礎上,使用動態SQL,將表名和字段名稱傳入,從而達到靈活的目的。
create or replace function str_list2( key_name in varchar2,key in varchar2,coname in varchar2,tname in varchar2 )return varchar2as type rc is ref cursor; str varchar2(4000); sep varchar2(2); val varchar2(4000); cur rc;begin open cur for 'select 'coname' from ' tname ' where ' key_name ' = :x ' using key; loop fetch cur into val; exit when cur%notfound; str := str sep val; sep := ', '; end loop; close cur; return str;end;SQL> select test.country, 2 str_list2('COUNTRY', test.country, 'CITY', 'TEST') emplist 3 from test 4 group by test.country 5 /COUNTRY EMPLIST-------------------- -----------------中國 臺北, 香港, 上海 日本 東京, 大阪
4.一條SQL語法: 靈活性★★★★ 性能★★ 難度 ★★★★ 一條SQL的法則是某位大師提出的,大家曾經在某個時期都樂此不彼的尋求各種的問題一條SQL法,但是大師的意思似乎被曲解,很多性能差,可讀性差,靈活差的SQL都是這個原則產物,所謂畫虎不成反成犬類。不過,解決問題始終是第一原則,這里還是給出一個比較有代表性的一條SQL方法。
SELECT country,max(substr(city,2)) cityFROM(SELECT country,sys_connect_by_path(city,',') cityFROM (SELECT country,city,countryrn rchild,country(rn-1) rfatherFROM (SELECT test.country ,test.city,row_number() over (PARTITION BY test.country ORDER BY test.city) rn FROM test))CONNECT BY PRIOR rchild=rfather START WITH rfather LIKE '%0') GROUP BY country;
下面分步解析,有4個FROM,就有4次結果集的操作。
step 1 給記錄加上序號rnSQL> SELECT test.country ,test.city,row_number() over (PARTITION BY test.country ORDER BY test.city) rn 2 FROM test 3 /COUNTRY CITY RN-------------------- -------------------- ----------日本 大阪 1日本 東京 2中國 上海 1中國 臺北 2 中國 香港 3
  step 2 創造子節點父節點:
SQL> SELECT country,city,countryrn rchild,country(rn-1) rfather 2 FROM 3 (SELECT test.country ,test.city,row_number() over (PARTITION BY test.country ORDER BY test.city) rn 4 FROM test) 5 / 日本 大阪 日本1 日本0 日本 東京 日本2 日本1 中國 上海 中國1 中國0 中國 臺北 中國2 中國1 中國 香港 中國3 中國2
step 3 利用sys_connect_by_path生成結果集:
SELECT country,sys_connect_by_path(city,',') city
FROM (SELECT country,city,countryrn rchild,country(rn-1) rfather FROM (SELECT test.country ,test.city,row_number() over (PARTITION BY test.country ORDER BY test.city) rn FROM test))CONNECT BY PRIOR rchild=rfather START WITH rfather LIKE '%0' 日本 ,大阪 日本 ,大阪,東京 中國 ,上海 中國 ,上海,臺北 中國 ,上海,臺北,香港
step 4 最終步驟,篩選結果集合:
SQL> SELECT country,max(substr(city,2)) city 2 FROM 3 (SELECT country,sys_connect_by_path(city,',') city 4 FROM 5 (SELECT country,city,countryrn rchild,country(rn-1) rfather 6 FROM 7 (SELECT test.country ,test.city,row_number() over (PARTITION BY test.country ORDER BY test.city) rn 8 FROM test)) 9 CONNECT BY PRIOR rchild=rfather START WITH rfather LIKE '%0') 10 GROUP BY country;COUNTRY CITY-------------------- -------中國 上海,臺北,香港 日本 大阪,東京
5.自定義聚合函數: 靈活性★★★★★ 性能★★★★★ 難度 ★★★★★ 最后一個方法是我認為“王道”的方法,自定義聚合函數。就如何我在本開始說的,為啥oracle沒有這種聚合函數呢?我也不知道,但Oracle提供了聚合函數的API可以讓我方便的自己定義聚合函數。 下面給出一個簡單的例子:
SQL> SELECT t.country,strcat(t.city) FROM test t GROUP BY t.country;COUNTRY STRCAT(T.CITY)-------------------- ------------------日本 東京,大阪中國 臺北,香港,上海簡單吧,和官方的函數一樣的便捷高效。函數:CREATE OR REPLACE FUNCTION strcat(input varchar2 )RETURN varchar2PARALLEL_ENABLE AGGREGATE USING strcat_type;TYPE:create or replace type strcat_type as object ( cat_string varchar2(4000), static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number, member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return number, member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type) return number, member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number) return number )
6.待發掘: 總結,合并字符串還有更多的方法希望大家能發掘,本文的目的主要是拋磚引玉,假如有新的發現我會繼續更新方法。需要注重的問題是,本文采用varchar2為例子,所以長度有限制,Oracle的版本對方法的實現也影響。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美极品少妇xxxxx| 欧美三级欧美成人高清www| 中日韩美女免费视频网址在线观看| 亚洲成avwww人| 久久久国产一区二区| 亚洲精品在线看| 国产精品网红福利| 日韩av片免费在线观看| 红桃av永久久久| 北条麻妃在线一区二区| 97久久超碰福利国产精品…| 色综合老司机第九色激情| 亚洲开心激情网| 欧美激情网友自拍| 久久久久亚洲精品成人网小说| 日本不卡视频在线播放| 国产精品久久久久久久久久久不卡| 久久国产精品偷| 91精品国产高清久久久久久| 久久久人成影片一区二区三区观看| 日韩av免费在线看| 欧美午夜宅男影院在线观看| 欧美wwwxxxx| 亚洲精品国产拍免费91在线| 亚洲精品欧美日韩专区| 久久久久久欧美| 国产精品视频一区国模私拍| 国产精品久久久久一区二区| 国产91在线播放精品91| 亚洲无限乱码一二三四麻| 中文字幕国产精品久久| 亚洲欧美福利视频| 久久综合88中文色鬼| 国产91网红主播在线观看| 精品无码久久久久久国产| 日韩69视频在线观看| 欧美激情国产日韩精品一区18| 成人黄色av网| 亚洲成人黄色在线| 欧美另类69精品久久久久9999| 亚洲精品欧美日韩| 国产一区二区三区在线观看视频| 亚洲在线视频观看| 欧美激情精品久久久久久| 欧美成人h版在线观看| 免费成人高清视频| 久久精品成人欧美大片| 欧美高清激情视频| 国产精品6699| 亚洲二区在线播放视频| 成人高清视频观看www| 久热爱精品视频线路一| 久热精品视频在线观看一区| 久久久久久999| 日本高清久久天堂| 国模私拍一区二区三区| 亚洲精品成人久久久| 日韩精品免费在线视频| 欧美亚洲国产视频| 亚洲风情亚aⅴ在线发布| 国产精品成人aaaaa网站| 国产美女精品视频免费观看| 国内精品久久久久久久| 正在播放欧美视频| 亚洲成人a级网| 国产欧美精品va在线观看| 亚洲成色www8888| 亚洲日韩第一页| 国产亚洲欧美另类中文| 久99九色视频在线观看| 久久久这里只有精品视频| 日韩激情视频在线播放| 国产亚洲视频在线观看| 日韩美女主播视频| 欧美成aaa人片免费看| 国产精品久久久久一区二区| 国产精国产精品| 国产一区二区在线播放| 亚洲精品98久久久久久中文字幕| 亚洲欧美一区二区三区四区| 久久久精品美女| 91精品国产91久久久久久| 国产精品吹潮在线观看| 欧美日韩一区二区三区| 欧美日韩午夜剧场| 欧美大片va欧美在线播放| 国产日韩精品视频| 亚洲成成品网站| 免费97视频在线精品国自产拍| 亚洲精品欧美极品| 国产精品视频网| 亚洲偷欧美偷国内偷| 国产综合久久久久| 日韩免费在线观看视频| 国产最新精品视频| 亚洲一区中文字幕| 日本道色综合久久影院| 国产精品影片在线观看| 九九精品在线观看| 日韩欧中文字幕| 欧美成aaa人片在线观看蜜臀| 欧美性猛交xxxx免费看| 亚洲精品一区二区网址| 久久精品国产99国产精品澳门| 91精品视频网站| 亚洲精品久久久久| 亚洲免费视频网站| 亚洲国产成人久久综合| 欧美裸体视频网站| 欧美性xxxxhd| 中文国产成人精品久久一| 日韩电影免费观看在线观看| 亚洲一区美女视频在线观看免费| 中文字幕无线精品亚洲乱码一区| 亚洲国产精品系列| 久久久国产影院| 热久久这里只有精品| 2019中文字幕在线| 亚洲最新av在线网站| 亚洲欧美一区二区三区久久| 91国产一区在线| 欧洲成人在线视频| 久久精品国产69国产精品亚洲| 亚洲自拍偷拍色片视频| 日韩精品中文字幕视频在线| 国产女人18毛片水18精品| 色吧影院999| 国产精品久久久久久久久久新婚| 在线视频精品一| 日韩大片在线观看视频| 国产成人高清激情视频在线观看| 色噜噜狠狠色综合网图区| 久久伊人免费视频| 日韩av在线导航| 欧美日韩在线免费观看| 中文字幕自拍vr一区二区三区| 久久久精品久久久久| 亚洲精品98久久久久久中文字幕| 日韩美女福利视频| 国产一区二区丝袜| 国产欧美一区二区三区在线| 国产日韩欧美日韩大片| 亚洲最大福利网站| 亚洲最大中文字幕| 久久久国产精品免费| 国外日韩电影在线观看| 91久久精品久久国产性色也91| 欧美最近摘花xxxx摘花| 国产成+人+综合+亚洲欧洲| 日韩福利在线播放| 91视频免费在线| 91免费人成网站在线观看18| 亚洲国产精品免费| 亚洲白拍色综合图区| 久久精品国产精品亚洲| 超在线视频97| 亚洲区一区二区| 国产在线视频欧美| 国产精品欧美激情| 日韩中文字幕视频| 久久免费视频这里只有精品| 中文字幕亚洲欧美日韩高清| 久久久午夜视频| 欧美老少做受xxxx高潮|