Oracle一列的多行数据拼成一行显示

Oracle一列的多行数据拼成一行显示字符 Oracle一列的多行数据拼成一行显示字符的方法一共有两种,如下: 1.oracle提供的函数WMSYS.WM_CONCAT,格式WMSYS.WM_CONCAT(A)。默认’,‘隔开,可以使用replace修改。 该函数是去重之后,才拼成一行的。 如: SELECT replace(WMSYS.WM_CONCAT(a.PHONE),’,’,’;’) from PHONE a;

2.oracle提供的函数ListAgg,语法格式: LISTAGG( [,]) WITHIN GROUP (ORDER BY ) [OVER (PARTITION BY )]

如:求客户的电话号码,存在多个情况下。 SELECT (SELECT listagg(a.PHONE,’;’) WITHIN GROUP(ORDER BY a.phone_seq) FROM PHONE a WHERE a.client_no = t.client_no) FROM client t;

但该函数无法去重排序,会导致一行中有重复的数据。那么可以使用正则表达式去重排序。 如:(select regexp_replace(listagg(nvl(cai.applicant_phone, cai.applicant_cellphone), ‘,’) within group(order by cai.applicant_no), ([^,]+)(,1)(,|$)’, ‘13’) from applicant_info cai) 电话 3.对于超过4000字节数据的拼接,一是可以转化为大数据集clob类型;二是截取出4000字节的。 (1)wm_concat拼接的方法: DBMS_LOB.SUBSTR(wm_concat(item),1000,1), DBMS_LOB.SUBSTR(wm_concat(item),1000,1001) (2)使用 xmlagg拼接: xmlagg(xmlparse(content 内容 || ‘,’ wellformed) order by 字段).getclobval(); 如果对字符长度有限制则可以截取 substr(xmlagg(xmlparse(content 内容 || ‘,’ wellformed) order by 字段).getclobval(), 0, 1024); (3)可以先查出表中的拼接字段数据的大小,再根据序列获取到小于4000字节下序列: SELECT SUM(lengthb(t.context)) OVER(ORDER BY t.lineno RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) rn, t. FROM gcregisttext t; 注: clob字段不能使用的情况如下: (1) distinct; (2) order by ; (3) group by; (4) union, intersect, minus; (5)clob字段做where关联; (6)clob字段是上创建索引。 总的来说,拼接的函数有WMSYS.WM_CONCAT、 listagg、 xmlagg。

经验分享 程序员 微信小程序 职场和发展