[Oracle] 오라클 XMLAGG 중복제거 방법 (DISTINCT)
- 데이터베이스/오라클
- 2023. 11. 2.
오라클에서 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
중복을 제거하기 위해서는 중복을 제거할 값이 정확히 정렬되어 있어야 한다.
구분자가 틀리다면 정규식 값에서 구분자 부분을 바꿔서 사용하면 된다.