DB

[DB] LISTAGG / STRING_AGG

오선지♬ 2025. 5. 16. 20:01
728x90
반응형

✅ 1. 기본 개념

항목 LISTAGG (Oracle) STRING_AGG (PostgreSQL, SQL Server)
목적 문자열 집계 (여러 행 → 하나의 문자열) 동일
지원 DB Oracle PostgreSQL, SQL Server 등
기본 구문 LISTAGG(col, ', ') WITHIN GROUP (ORDER BY col) STRING_AGG(col, ', ')
정렬 WITHIN GROUP (ORDER BY col) 필요 ORDER BY col 옵션 제공 (WITHIN GROUP 아님)
중복 제거 DISTINCT 서브쿼리 필요 DISTINCT 바로 사용 가능 (PostgreSQL 13+)
 

✅ 2. 예제 비교

📌 Oracle (LISTAGG)

SELECT 
	DEPT_ID
    , LISTAGG(EMP_NAME, ', ') WITHIN GROUP (ORDER BY EMP_NAME) AS EMP_LIST 
FROM EMPLOYEES GROUP BY DEPT_ID;

📌 PostgreSQL (STRING_AGG)

 
SELECT 
	DEPT_ID
    , STRING_AGG(EMP_NAME, ', ' ORDER BY EMP_NAME) AS EMP_LIST 
FROM EMPLOYEES GROUP BY DEPT_ID;

📌 SQL Server (STRING_AGG)

 
SELECT 
	DEPT_ID
    , STRING_AGG(EMP_NAME, ', ') WITHIN GROUP (ORDER BY EMP_NAME) AS EMP_LIST 
FROM EMPLOYEES GROUP BY DEPT_ID;

SQL Server 2017부터 STRING_AGG 지원
PostgreSQL은 9.0부터 STRING_AGG 지원, 13부터 DISTINCT도 지원


✅ 3. 중복 제거 방식 차이

항목 Oracle (LISTAGG) PostgreSQL (STRING_AGG)
중복 제거 반드시 DISTINCT를 서브쿼리로 감싸야 함 PostgreSQL 13 이상에서는 직접 사용 가능
예시 LISTAGG((SELECT DISTINCT ...), ', ') ... STRING_AGG(DISTINCT col, ', ')
 

✅ 4. 긴 문자열 처리 (오버플로우)

항목 Oracle PostgreSQL / SQL Server
문자열 길이 제한 기본 4000 CHAR 또는 32K CLOB (버전에 따라) 제한 없음 (사이즈 크게 설정 가능)
트렁크 옵션 ON OVERFLOW TRUNCATE (Oracle 12c 이상) 따로 옵션 없음 (함수 직접 커스터마이징)
 
-- Oracle 12c 이상 
LISTAGG(EMP_NAME, ', ') WITHIN GROUP (ORDER BY EMP_NAME) ON OVERFLOW TRUNCATE '...'

✅ 요약

항목 LISTAGG (Oracle) STRING_AGG (PostgreSQL / SQL Server)
가독성 복잡함 (정렬 필수, 중복 제거 어려움) 간단함 (DISTINCT 사용 가능, ORDER BY 자유로움)
정렬 방식 WITHIN GROUP (ORDER BY) ORDER BY 옵션 지원
중복 제거 서브쿼리 필요 DISTINCT 키워드 바로 사용 가능
문자열 길이 제한 있음 (오버플로우 오류 발생 가능) 거의 없음
728x90
반응형