[Oracle] 오라클 XMLAGG 중복제거 방법 (DISTINCT)

오라클에서 XMLAGG 함수를 사용하여 여러 행의 칼럼을 하나의 문자열로 합칠 수 있다. XMLAGG 함수에서는 DISTINCT 연산자를 사용하여 중복을 제거할 수 없다. 합쳐진 문자열에서 중복된 값을 제거하기 위해서는 정규식 함수(REGEXP_REPLACE)를 사용하여 중복을 제거하면 된다.

 

XMLAGG 함수 중복제거 방법

SELECT REGEXP_REPLACE(
           SUBSTR(XMLAGG(XMLELEMENT(job , ',' , job) ORDER BY job).EXTRACT('//text()').GETSTRINGVAL(), 2)
           , '([^,]+)(,\1)+', '\1')
  FROM emp
 WHERE deptno = 20

 

 

쉼표를 구분자로 사용하여 문자열을 합친다. 반드시 ORDER BY를 사용하여 합칠 칼럼을 정렬해야 한다.

정규식 함수(REGEXP_REPLACE)를 사용하여 중복된 칼럼 값을 제거한다.

 

 

2개 이상 중복된 값이 제거된 것을 확인할 수 있다.

 

정규식 함수로 중복을 제거하는 방법은 DISTINCT 연산자를 사용할 수 없기 때문에 임시방편으로 사용하는 방법이다.

상황에 따라서 중복제거가 정확히 안될 수 있으니 유의해서 사용해야 한다.

 

REGEXP_REPLACE 함수 중복제거 원리

SELECT REGEXP_REPLACE('AAA,AAA,AAA,BBB,BBB,CCC', '([^,]+)(,\1)+', '\1') AS result1
     , REGEXP_REPLACE('AAA,BBB,CCC,AAA,BBB,CCC', '([^,]+)(,\1)+', '\1') AS result2
     , REGEXP_REPLACE('123#456#456#456', '([^#]+)(#\1)+', '\1')         AS result3
  FROM dual

 

 

중복을 제거하기 위해서는 중복을 제거할 값이 정확히 정렬되어 있어야 한다.

구분자가 틀리다면 정규식 값에서 구분자 부분을 바꿔서 사용하면 된다.

예제쿼리(테이블포함).txt
0.00MB

 

[Oracle] 오라클 문자열 합치기 3가지 방법

오라클에서 GROUP BY 절과 SUM 함수를 사용하여 숫자를 합산할 수 있다. 그러나 문자열인 경우 SUM 함수를 사용하여 문자열을 합칠 수는 없고 대신에 LISTAGG, XMLAGG, WM_CONCAT 함수를 사용하여 그룹별 문

gent.tistory.com

 

[Oracle] 오라클 LISTAGG 함수 사용법

오라클에서 여러 행의 컬럼 값을 하나로 합치기 위해서는 XMLAGG(오라클 9i 이하), WM_CONCAT(오라클 10g~11g R1) 함수를 사용하였다. 오라클 11g R2 버전부터 WM_CONCAT 함수를 사용을 할 수 없으며 LISTAGG 함

gent.tistory.com

 

댓글

Designed by JB FACTORY