电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:37日期: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 數據庫
主站蜘蛛池模板: 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 康明斯发电机,上柴柴油发电机,玉柴柴油发电机组_海南重康电力官网 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 浩方智通 - 防关联浏览器 - 跨境电商浏览器 - 云雀浏览器 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 南京交通事故律师-专打交通事故的南京律师 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 铁盒_铁罐_马口铁盒_马口铁罐_铁盒生产厂家-广州博新制罐 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 好物生环保网、环保论坛 - 环保人的学习交流平台 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 上海质量认证办理中心| 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 |