1 概述
1. 目的
(1) 去除多行显示在一行中的 '重复数据'
(2) regexp_replace():'替换数据' -- 依赖的方法
2. 前提
(1) 字符串长度不能超过 4000 -- varchar2 最大长度 4000
-- 若超过,先聚合 group by
(2) 必须 '排序',因为:'相邻' 的子字符串才会做去重处理 -- 实现原理
而这点,和 listagg 相当契合
2 示例
语法:
regexp_replace(listagg('列1', ',') within group(order by '列2'),
'([^,]+)(,\1)*(,|$)',
'\1\3')
regexp_replace('源字符串', '正则表达式', '新字符串')
-- 将 '源字符串' 中 符合 '正则表达式' 的字符串替换为 '新字符串'
示例:
select regexp_replace('1,1,3,5,5', '([^,]+)(,\1)*(,|$)', '\1\3')
from dual;
-- 结果: 1,3,5
解释:去掉 ‘源字符串’ 中重复的数据
括号1 = ([^,]+) : 1个或多个非 ',' 的数据,如: 1 1 3 5 5
括号2 = ([^,]+)(,\1) : 括号1 中以 ',' 隔开的 '重复数据' (1,1),(5,5)
([^,]+)(,\1)*: (1,1),(3),(5,5)
括号3 = (,|$) : ',' 或 '$'
'\1\3' = '重复' 括号1 和 括号3 中的数据
\n: 表示重复正则第 n 个圆括号内匹配到的内容
如: ([a-z])([a-z])\2\1 就可以匹配到 abba
若第一个 '()' 中为 a,则 \1 = a
第二个 '()' 中为 b,则 \2 = b