1. 程式人生 > >Oracle字串分隔符替換(替換奇數個或偶數個)

Oracle字串分隔符替換(替換奇數個或偶數個)

罪惡,,,,居然在圖書館佔位子,,,

標題不知道怎麼寫比較適合,這是群裡面一個小夥伴問我的問題,一番折騰後感覺思路比較有意思,就記錄一下。

問題:

大概就是一個字串:"11-12,11-21,11-22,11-24",需要處理成"11-12至11-21,11-22至11-24",即兩個日期為一組,用“至”連線,然後每組日期用逗號隔開。

於是乎,折騰一番後,

思路是:

1、先按逗號拆分成單個日期,加上一個分組欄位,連續兩個日期為同一組;

2、按照分組用listagg進行聚合,用“至”分隔,這樣,兩個為一組的就拼接出來了;

3、將各組重新聚合,用逗號分隔,如此。

程式碼如下,with as的結構跟上面思路分點一樣:

with t1 as (
  select regexp_substr('11-12,11-21,11-22,11-24', '[^,]+', 1, level ) dt
       , level lv, round(level/2) grp
    from dual 
    connect by level <= regexp_count('11-12,11-21,11-22,11-247', '[^,]+')
), t2 as (
   select grp, listagg(dt, '至')within group(order by lv) str 
     from t1 group by grp
)
select listagg(str, ',')within group(order by grp) str from t2;

結果如下: