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
반응형
'DB' 카테고리의 다른 글
[DB][Oracle] 동적으로 정렬이 바뀔 때 행 번호 매기기 (ROWNUM, ROW_NUMBER()) (0) | 2025.05.19 |
---|---|
[DB][Oracle] ROWNUM / ROW_NUMBER() (0) | 2025.05.18 |
[DB][Oracle] LISTAGG (0) | 2025.05.15 |
[DB] DBMS별 기본 NULL 정렬 방식 (0) | 2025.04.13 |
[DB][Oracle] INSTR Null 처리 (0) | 2025.04.12 |