Oracle listagg() 中的子字符串去重 regexp_replace

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 括號中的內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章