Notice
Recent Posts
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

IT'S YU

[Oracle] 정규식을 활용한 LISTAGG 중복제거 본문

DB/Oracle

[Oracle] 정규식을 활용한 LISTAGG 중복제거

자석 2022. 9. 22. 13:20

LISTAGG 내에서는 DISTINCT 구문 먹히지 않아서 아래와 같은 정규식 구문으로 중복 제거 가능

regexp_replace(LISTAGG(컬럼명, ',') WITHIN GROUP(ORDER BY 컬럼명), '([^,]+)(,\1)+', '\1')
regexp_replace(LISTAGG(컬럼명, ',') WITHIN GROUP(ORDER BY 컬럼명), '([^,]+)(,\1)*(,|$)', '\1\3')

 

근데 경우에 따라서 위 정규식도 안먹히는 경우가 있음..

WM_CONCAT은 WM_CONCAT(DISTINCT 컬럼명) 가능하지만 구분자가 ',' 으로만 출력됨

한줄로 출력해야하는 데이터 내에 콤마(,)가 있는 경우는 LISTAGG를 쓸 수 밖에 없음

 

이 경우엔 최후의 수단으로

1. 해당 컬럼의 데이터에 콤마(,)가 포함된 값을 | 등의 다른 기호로 REPLACE

-> REPLACE(컬럼명, ',' , '|' )

2. 우선 WM_CONCAT으로 이어줌

-> WM_CONCAT(DISTINCT REPLACE(컬럼명, ',' , '|') 

3. WM_CONCAT해준 결과에서 콤마(,)로 이어진걸 슬래쉬(/)등으로 REPLACE

4. 1에서 REPLACE 했던 |을 다시 콤마(,)로 바꿔주면 되긴 할 듯