데이터베이스에서 문자열을 합치는 작업은 매우 자주 사용됩니다. 특히 여러 행(row)의 데이터를 하나의 문자열로 묶거나, 단순히 값 사이에 구분자(,)를 넣어 합칠 때 오라클에서는 다양한 함수와 방법을 제공합니다. 이 글에서는 || 연산자부터 LISTAGGXMLAGG 등 상황에 맞게 사용할 수 있는 콤마 이어붙이기 방법들을 정리해 보겠습니다.


1. 문자열 단순 이어붙이기 – || 연산자

오라클에서는 문자열을 이어 붙일 때 || 연산자를 사용합니다.

SELECT 'A' || ',' || 'B' || ',' || 'C' AS result FROM dual;
-- 결과: A,B,C


간단한 문자열 연결에는 가장 직관적이고 빠른 방법입니다.


2. CONCAT 함수

CONCAT 함수는 두 개의 문자열을 연결할 수 있습니다.

SELECT CONCAT('A', CONCAT(',', 'B')) AS result FROM dual;
-- 결과: A,B


3. 여러 행을 하나로 묶기 – LISTAGG 함수

여러 개의 행을 콤마로 이어붙이고 싶다면 LISTAGG 함수를 사용합니다.

SELECT LISTAGG(name, ',') WITHIN GROUP (ORDER BY name) AS name_list
FROM employees;
-- 결과: Alice,Bob,Charlie
  • LISTAGG(컬럼, 구분자) : 지정한 구분자로 연결
  • WITHIN GROUP (ORDER BY ...) : 정렬 기준


4. 중복 제거 – LISTAGG(DISTINCT ...)

오라클 19c 이상에서는 DISTINCT 옵션을 바로 적용할 수 있습니다.

SELECT LISTAGG(DISTINCT department, ',') 
       WITHIN GROUP (ORDER BY department) AS dept_list
FROM employees;


만약 12c 이하라면 DISTINCT를 서브쿼리에 적용해야 합니다.

5. 긴 문자열 처리 – XMLAGG + XMLELEMENT

LISTAGG는 4000자 제한이 있어 긴 문자열을 합칠 때는 XMLAGG를 사용할 수 있습니다.

SELECT RTRIM(XMLAGG(XMLELEMENT(e, name || ',') ORDER BY name).
        EXTRACT('//text()'), ',') AS name_list 
  FROM employees;
  • XMLAGG는 CLOB 타입을 반환하므로 더 큰 문자열을 처리할 수 있습니다.

6. PL/SQL 루프 활용

PL/SQL 블록 내에서 커서를 돌며 문자열을 합치는 방법도 있습니다.

DECLARE
    v_list VARCHAR2(32767);
BEGIN
    FOR rec IN (SELECT name FROM employees ORDER BY name) LOOP
        v_list := v_list || rec.name || ',';
    END LOOP;
    v_list := RTRIM(v_list, ',');
    DBMS_OUTPUT.PUT_LINE(v_list);
END;

마무리

오라클에서 콤마 이어붙이기를 구현하는 방법은 다양합니다. 단순한 문자열 연결에는 || 연산자를, 여러 행을 묶을 때는 LISTAGG를, 긴 문자열을 다룰 때는 XMLAGG를 사용하는 것이 좋습니다. 업무 환경에 맞는 최적의 방법을 선택해 활용해 보세요.