[Oracle] WM_CONCAT 함수 사용법 (중복제거, 대체함수)
- 데이터베이스/오라클
- 2023. 7. 31.
오라클 쿼리에서 여러 행의 값을 하나의 열로 합치기 위해서 WM_CONCAT 함수를 사용할 수 있다. WM_CONCAT 함수는 사용법이 쉽고 중복제거도 되기 때문에 많이 사용했지만 오라클 11g R2부터는 해당 함수를 사용할 수 없으니 사용 시 유의해야 한다. 오라클 11g R2부터는 WM_CONCAT 함수 대신 LISTAGG 함수를 사용할 수 있다.
목차 |
WM_CONCAT 함수 사용법
SELECT job
, WM_CONCAT(deptno) AS deptnos
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN')
GROUP BY job
GROUP BY 절과 WM_CONCAT 함수를 사용하여 여러 행의 값을 하나의 열로 합칠 수 있다.
쉼표(,) 구분자를 사용하여 문자열을 합치며, 값을 정렬할 수는 없으며 순서대로 값을 합친다.
※ WM_CONCAT 함수는 오라클 10g부터 오라클 11g R1까지만 사용가능
SELECT job
, WM_CONCAT(DISTINCT deptno) AS deptnos
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN')
GROUP BY job
WM_CONCAT 함수는 DISTINCT를 사용하여 합칠 값의 중복을 제거하고 합칠 수 있다.
ORA-00904: "WM_CONCAT": 부적합한 식별자 |
WM_CONCAT 함수는 오라클 10g부터 오라클 11g R1까지 사용할 수 있으며, 해당 오라클 버전이 아닐 경우 "부적절한 식별자" 오류가 발생할 수 있다.
오라클 11g R2 이상의 부전인 경우 아래의 LISTAGG 함수를 사용하면 된다.
LISTAGG 함수 사용법
SELECT job
, LISTAGG(deptno, ',') WITHIN GROUP(ORDER BY deptno) AS deptnos
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN')
GROUP BY job
LISTAGG 함수는 값을 합칠 때 구분자를 지정할 수 있으며, 값의 정렬도 가능하다.
SELECT job
, LISTAGG(DISTINCT deptno, ',') WITHIN GROUP(ORDER BY deptno) AS deptnos
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN')
GROUP BY job
LISTAGG 함수에서 DISTINCT를 사용할 수 있지만 오라클 19c 이상의 버전에서만 지원한다.
ORA-30482: DISTINCT 옵션은 이 함수에 사용할 수 없습니다 |
오라클 19c 미만의 버전에서 LISTAGG 함수 사용 시 정규식을 사용하여 중복을 제거하는 방법도 있으니 아래의 포스팅을 참고하면 된다.