IT'S YU
[Oracle] 정규식을 활용한 LISTAGG 중복제거 본문
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 했던 |을 다시 콤마(,)로 바꿔주면 되긴 할 듯
'DB > Oracle' 카테고리의 다른 글
[Oracle] ORA-01861: 리터럴이 형식 문자열과 일치하지 않음 오류 (1) | 2022.12.07 |
---|---|
[Oracle] ORA-01841 : 년은 영이 아닌 -4713 과 +4713 사이의 값으로 지정해야 합니다. (2) | 2022.11.02 |
[Oracle] REGEXP_REPLACE 전체 특수문자 제거 (2) | 2022.09.16 |
[Oracle] LPAD 함수 사용하여 공백 채우기 "0 채우기" (0) | 2022.08.19 |
[Oracle] WITH문과 CREATE TABLE 쓰기 (0) | 2022.08.16 |