Oracle 子字符串去重
- 字符串長度不能過長(一般不超過 varchar2 的最大長度: 4000)
- 必須
排序
(所以和listagg()
比較契合)- 原因:
相鄰
的子字符串纔會做去重處理
- 原因:
SELECT regexp_replace(listagg('選擇的列', ',') within GROUP(ORDER BY '排列的列'),
'([^,]+)(,\1)*(,|$)',
'\1\3')
FROM dual;
舉例:
SELECT regexp_replace('1,1,3,5,5', '([^,]+)(,\1)*(,|$)', '\1\3')
FROM dual;
-- 結果: 1,3,5
解釋:
[^,]+
:匹配 1 個或多個非,
的內容[^,]
:除,
外的字符 (如:1 1 3 5 5
)+
: 存在 1 個 或 多個
(,\1)*
:匹配 0 個 或 多個與第一個()
中相同的內容,\1
:,
+ 與第一個字符相同的字符*
:存在 0 個 或者 多個
(,|$)
: 匹配,
或者$
(結束符)\1\3
: 替換爲第 1、3 括號中的內容