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)(,|$)’,
‘\1\3’)
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。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值