欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Oracle 多行記錄合并/連接/聚合字符串的幾種方法

Oracle 多行記錄合并/連接/聚合字符串的幾種方法

熱門標簽:北京外呼系統公司排名 百度地圖標注員是干什么 外呼系統鄭州 貴陽智能電銷機器人官網 沈陽400電話是如何辦理 外呼系統口號 北京營銷外呼系統廠家 地圖標注付款了怎么找不到了 溫州人工外呼系統
什么是合并多行字符串(連接字符串)呢,例如:
SQL> desc test;
Name Type Nullable Default Comments
------- ------------ -------- ------- --------
COUNTRY VARCHAR2(20) Y
CITY VARCHAR2(20) Y

SQL> select * from test;


COUNTRY CITY
-------------------- --------------------
中國 臺北
中國 香港
中國 上海
日本 東京
日本 大阪
要求得到如下結果集:
------- --------------------
中國 臺北,香港,上海
日本 東京,大阪
實際就是對字符實現一個聚合功能,我很奇怪為什么Oracle沒有提供官方的聚合函數來實現它呢:)
下面就對幾種經常提及的解決方案進行分析(有一個評測標準最高★★★★★):
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
is
str_list varchar2(4000) default null;--連接后字符串
str varchar2(20) default null;--連接符號
begin
for x in ( select TEST.CITY from TEST where TEST.COUNTRY = str_in ) loop
str_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 varchar2
as
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)) city
FROM
(SELECT country,sys_connect_by_path(city,',') city
FROM
(SELECT country,city,country||rn 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')
GROUP BY country;
下面分步解析,有4個FROM,就有4次結果集的操作。
step 1 給記錄加上序號rn
SQL> 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,country||rn 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,country||rn 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,country||rn 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
-------------------- -------
中國 上海,臺北,香港
日本 大阪,東京


可謂是,7歪8搞,最后還是弄出來了,呵呵。 PS:(邏輯上是對的..但是寫的比較繁瑣,可以簡化!)
5.自定義聚合函數 靈活性★★★★★ 性能★★★★★ 難度 ★★★★★
最后一個方法是我認為“王道”的方法,自定義聚合函數。
就如何我在本開始說的,為啥oracle沒有這種聚合函數呢?我也不知道,但oracle提供了聚合函數的API可以讓我方便的自己定義聚合函數。
詳細可以看Oracle Data Catridge guide這個文檔。連接如下:
http://www.oracle.com.cn/other/9ionlinedoc/appdev.920/a96595/toc.htm
下面給出一個簡單的例子:
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 varchar2
PARALLEL_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.待發掘...

PS: 在 oracle 10g下,可以使用以下系統函數:
select id,WMSYS.WM_CONCAT(oid) oid
from table1
group by id
總結,合并字符串還有更多的方法希望大家能發掘,本文的目的主要是拋磚引玉,如果有新的發現我會繼續更新方法。需要注意的問題是,本文采用varchar2為例子,所以長度有限制,oracle的版本對方法的實現也影響。
您可能感興趣的文章:
  • oracle合并列的函數wm_concat的使用詳解
  • oracle實現多行合并的方法
  • oracle列合并的實現方法
  • oracle 合并查詢 事務 sql函數小知識學習
  • oracle如何合并多個sys_refcursor詳解

標簽:淮北 潮州 衡水 定西 溫州 衢州 通遼 包頭

巨人網絡通訊聲明:本文標題《Oracle 多行記錄合并/連接/聚合字符串的幾種方法》,本文關鍵詞  Oracle,多行,記錄,合并,連接,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle 多行記錄合并/連接/聚合字符串的幾種方法》相關的同類信息!
  • 本頁收集關于Oracle 多行記錄合并/連接/聚合字符串的幾種方法的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日韩在线一卡二卡| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲成av人片在www色猫咪| 91农村精品一区二区在线| 少妇影院在线观看| 国产精品成人在线观看| 国产成人精品免费在线| fc2ppv在线播放| 国产精品美女www爽爽爽| 国产白丝精品91爽爽久久| 手机av在线看| 亚洲色图.com| 宇都宫紫苑在线播放| 精品视频999| 水蜜桃久久夜色精品一区的特点| av2014天堂网| 精品噜噜噜噜久久久久久久久试看 | 日韩一二在线观看| 日本亚洲一区二区| 自拍偷拍视频亚洲| 日本一区二区免费在线| 成人av资源网站| 欧洲一区二区av| 亚洲国产精品麻豆| 中文字幕av网址| 久久久久久电影| 高潮精品一区videoshd| 在线视频观看一区| 亚洲v中文字幕| 中文字幕在线看高清电影| 国产亚洲欧洲一区高清在线观看| 粉嫩av一区二区三区| 日本精品视频一区二区| 亚洲不卡在线观看| 老头老太做爰xxx视频| 中文字幕人成不卡一区| 欧美一区二区三区影院| 日韩视频免费直播| 国产传媒久久文化传媒| 在线国产电影不卡| 婷婷激情综合网| 中文字幕求饶的少妇| 亚洲黄色在线视频| 一卡二卡三卡四卡| 国产精品初高中害羞小美女文| 久久久久久久久久久影视| 精品久久久网站| 成人av网站免费| 欧美一级xxx| 国产91精品精华液一区二区三区| 欧美三级三级三级爽爽爽| 男男gaygay亚洲| 视频一区视频二区中文| 青青青视频在线播放| 亚洲免费在线观看| a级片在线观看| 日韩理论电影院| 成年人免费观看视频网站| 亚洲欧洲三级电影| 少妇大叫太粗太大爽一区二区| 国产精品二区一区二区aⅴ污介绍| 伊人影院在线观看视频| 久久综合国产精品| 天堂va欧美va亚洲va老司机| 久久久精品国产免费观看同学| 宇都宫紫苑在线播放| 国产亚洲精品免费| 男男一级淫片免费播放| 中文字幕的久久| 亚洲男人在线天堂| 亚洲三级在线观看| 亚洲精品一区二区三区影院忠贞| 日本黄色免费观看| 免费91在线观看| 亚洲在线一区二区三区| 午夜影院黄色片| 亚洲成在人线在线播放| 国产又粗又猛又爽又黄的视频小说| 亚洲一区二区三区中文字幕在线| 男人天堂资源网| 日韩精品乱码av一区二区| 色综合久久久久综合体桃花网| 免费观看91视频大全| 欧美系列一区二区| 国产成人av自拍| 日韩女优制服丝袜电影| 免费欧美一级片| 国产精品成人免费精品自在线观看| 中文字幕人妻一区二区| 亚洲一区二区三区激情| 久久免费看少妇高潮v片特黄| 麻豆中文一区二区| 91精品婷婷国产综合久久竹菊| 99精品视频一区| 欧美高清在线视频| 性猛交娇小69hd| 奇米影视在线99精品| 欧美日韩成人综合天天影院| 成人白浆超碰人人人人| 国产三级一区二区三区| www在线观看免费视频| 婷婷激情综合网| 欧美猛男男办公室激情| 91在线播放网址| 18欧美乱大交hd1984| 国产精品久久久免费看| 久久99精品久久久久久动态图 | 国产不卡免费视频| 久久久亚洲精品一区二区三区| 青青草成人免费视频| 亚欧色一区w666天堂| 欧洲一区二区三区在线| 97精品久久久午夜一区二区三区| 亚洲欧洲精品一区二区精品久久久 | 久久久久久国产免费a片| 欧美bbbbb| 日韩欧美国产综合一区| 玖草视频在线观看| 日韩激情视频在线观看| 欧美一级理论性理论a| 国产激情第一页| 日韩中文字幕区一区有砖一区 | 国产探花视频在线播放| 久久99精品久久久久久| 2020国产成人综合网| 国产在线观看h| 加勒比av一区二区| 久久久久久久综合色一本| 大吊一区二区三区| 国产精品主播直播| 国产精品网站在线| 麻豆精品一区二区三区视频| www.色精品| 一区av在线播放| 91亚洲男人天堂| 亚洲精品va在线观看| 欧美三级视频在线播放| 国产xxxx视频| 美女被吸乳得到大胸91| 久久精品视频一区| 国产精品久久久久久久精| 91小视频免费看| 丝袜美腿成人在线| 26uuu国产一区二区三区| 天美传媒免费在线观看| 成人精品在线视频观看| 亚洲六月丁香色婷婷综合久久| 欧美体内she精高潮| 香港三日本8a三级少妇三级99| 蜜臀91精品一区二区三区| 久久久久久**毛片大全| 日韩欧美123区| 国产日韩一级二级三级| 极品尤物av久久免费看| 国产人成亚洲第一网站在线播放| 四虎永久免费地址| 男人女人拔萝卜视频| 日韩va欧美va亚洲va久久| 2021中文字幕一区亚洲| 欧美又粗又大又长| 成人午夜精品无码区| 国内成人精品2018免费看| 国产精品久久久久aaaa樱花| 欧美无人高清视频在线观看| 亚洲精品视频大全| 国产黑丝在线一区二区三区| 亚洲男人天堂一区| 日韩一级大片在线| 永久免费未视频| 亚洲麻豆一区二区三区| 韩国av一区二区三区| 亚洲日本va午夜在线电影| 欧美一级国产精品| 日本裸体美女视频| 女教师高潮黄又色视频| 六月丁香婷婷色狠狠久久| 中文字幕日韩av资源站| 日韩一区二区三| 欧美三级日本三级| 97人妻精品一区二区三区免 | 日本人亚洲人jjzzjjz| 99久久久久久99| 久久国产夜色精品鲁鲁99| 亚洲男人的天堂在线观看| 日韩欧美在线影院| 色一情一伦一子一伦一区| 亚洲av综合一区二区| 91在线视频网址| 久久99精品久久久久久久久久久久 | 久久66热偷产精品| 一区二区三区 在线观看视频| 色爱区综合激月婷婷| 天堂成人国产精品一区| 久久精品亚洲精品国产欧美| 欧美日韩一级视频| 在线观看天堂av| 无码国产69精品久久久久网站| 国产成人在线视频网址| 手机精品视频在线观看| 亚洲品质自拍视频|