[Oracle] WM_CONCAT 함수 사용법 (중복제거, 대체함수)

오라클 쿼리에서 여러 행의 값을 하나의 열로 합치기 위해서 WM_CONCAT 함수를 사용할 수 있다. WM_CONCAT 함수는 사용법이 쉽고 중복제거도 되기 때문에 많이 사용했지만 오라클 11g R2부터는 해당 함수를 사용할 수 없으니 사용 시 유의해야 한다. 오라클 11g R2부터는 WM_CONCAT 함수 대신 LISTAGG 함수를 사용할 수 있다.

 

목차
  1. WM_CONCAT 함수 사용법
  2. 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 함수 사용 시 정규식을 사용하여 중복을 제거하는 방법도 있으니 아래의 포스팅을 참고하면 된다.

 

[Oracle] LISTAGG 함수 사용법 (정규식 중복제거)

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

gent.tistory.com

 

[Oracle] Group By 문자열 합치기 3가지 방법

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

gent.tistory.com

 

댓글

Designed by JB FACTORY