日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:134日期:2023-11-19 11:22:52
怎么合并多行記錄的字符串,一直是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; loopfetch 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的版本對方法的實現也影響。
標簽: Oracle 數據庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品欧美大片| 欧美精品自拍| 久久国产乱子精品免费女| 欧美亚洲福利| 卡一卡二国产精品| 欧洲av不卡| 99国产一区| 日韩高清在线不卡| 成人在线观看免费视频| 国产99亚洲| 亚洲精选久久| 国产精品久久免费视频| 老牛影视精品| 国产一级一区二区| 欧美一区激情| 欧美成人基地 | 久久男人av资源站| 久久精品动漫| 日韩三级精品| 日韩88av| 蜜桃视频第一区免费观看| 日韩精品看片| 亚洲麻豆一区| 久久中文精品| 亚洲国产一区二区在线观看| 日韩精品a在线观看91| 卡一精品卡二卡三网站乱码| 亚洲国产综合在线看不卡| 天堂精品久久久久| 成人在线黄色| 蜜桃免费网站一区二区三区| 嫩呦国产一区二区三区av| 99久久久久国产精品| 日韩av一区二区在线影视| 欧美日韩国产观看视频| 中文字幕亚洲在线观看| 天堂中文在线播放| 日本不卡中文字幕| 亚洲性色av| 国产亚洲精品美女久久 | 欧美日韩夜夜| 国产专区一区| 国产精品久久777777毛茸茸| aa亚洲婷婷| 成人三级高清视频在线看| 亚洲区欧美区| 久久人人99| 久久99影视| 亚洲精品乱码日韩| 欧美丝袜一区| 精品国产乱码久久久久久樱花| 欧美精品一区二区三区精品| 欧美a在线观看| 日产欧产美韩系列久久99| 免费毛片在线不卡| а√天堂8资源中文在线| 日韩和欧美的一区| 亚洲免费婷婷| 播放一区二区| 国产成人a视频高清在线观看| 日本精品另类| 中文无码日韩欧| 国产综合婷婷| 国产中文在线播放| 国产精品v一区二区三区| 精品国产一区二区三区噜噜噜| 欧美 日韩 国产一区二区在线视频 | 综合一区二区三区| 精品欧美久久| 欧美日韩视频网站| 风间由美中文字幕在线看视频国产欧美| 91日韩免费| 精品一级视频| 国产精品成人3p一区二区三区| 国产亚洲精品v| 亚洲电影在线一区二区三区| 婷婷成人基地| 精品一区欧美| 91精品蜜臀一区二区三区在线| 韩国女主播一区二区三区| 国产精品一区三区在线观看| 日本成人在线一区| 三级久久三级久久久| 免费黄网站欧美| 久久www成人_看片免费不卡| 五月天久久久| 9久re热视频在线精品| 国产一区久久| 美女网站一区| 免费观看久久av| 伊人影院久久| 香蕉成人久久| 亚洲天堂免费| 日本99精品| 国产美女视频一区二区| 欧美日韩一视频区二区| 国产美女久久| 美女视频黄久久| 丰满少妇一区| 97精品97| 日韩精品麻豆| 午夜久久久久| 男人的天堂久久精品| 亚洲综合小说| 日韩精品视频在线看| 国产精品多人| 视频在线不卡免费观看| 日韩成人高清| 亚洲免费激情| 综合干狼人综合首页| 久久狠狠亚洲综合| 国产一区二区精品福利地址| 色爱av综合网| 亚洲免费影视| 国产欧美一区二区三区国产幕精品 | 日本午夜精品一区二区三区电影| 日韩在线a电影| 欧美亚洲人成在线| 国产精品xx| 激情综合网站| 91欧美日韩在线| 国产一区二区三区四区二区| 欧美精品日日操| 视频一区视频二区在线观看| 日本中文字幕不卡| 国产精品日本一区二区不卡视频 | 日韩成人综合| 99在线精品免费视频九九视| 亚洲乱码一区| 日本激情一区| 亚洲一区二区三区高清| 欧美一级网站| 国产超碰精品| 亚洲精品国产精品粉嫩| 美女性感视频久久| 国产高清一区二区| 国产九九精品| 免费精品国产的网站免费观看| 欧美日韩精品一区二区三区视频| 中文字幕在线免费观看视频| 中文一区二区| 欧美精品1区| 久久亚洲色图| 成人美女视频| 国产精选久久| 午夜在线观看免费一区| 精品不卡一区| 亚洲影院天堂中文av色| 国产夫妻在线| 日韩和欧美一区二区三区| 精精国产xxxx视频在线播放| 日本一区二区中文字幕| 日韩久久电影| 国产日韩一区二区三区在线| 免费国产自久久久久三四区久久 | 国产日韩在线观看视频| 亚洲大全视频| 国内精品美女在线观看| 中文字幕日韩亚洲| 久久蜜桃av| 精品网站999| 日本久久一区| 国产视频一区三区| 黑人精品一区| 欧美日韩18| 玖玖精品视频| 91精品久久久久久久久久不卡| 久久99精品久久久久久园产越南 | 久久只有精品| 日韩免费精品| 亚洲主播在线| 亚洲h色精品| 亚洲天堂资源| 精品久久99| 国产精品久久乐| 日av在线不卡| 久久一级电影| 亚洲精品福利电影| 麻豆91小视频| 欧美韩一区二区| 日韩不卡一二三区| 日av在线不卡| 亚洲作爱视频| 99久久亚洲精品| 婷婷综合六月| 精品国产99| 久久免费精品| 麻豆一区在线| 欧美国产极品| 国产精品亚洲片在线播放| 亚洲精品国产精品粉嫩| 欧美日韩视频| 日韩视频免费| 国产精品毛片在线看| 午夜欧美精品| 国产农村妇女精品一二区| 美女毛片一区二区三区四区| 久久在线视频免费观看| 激情久久久久久| 欧美搞黄网站|