Oracle
[Oracle] LISTAGG 사용 시 적용 안 되는 케이스(NVARCHAR2)
상후
2023. 10. 4. 21:23
728x90
반응형
LISTAGG() 를 사용하여 A,B,C 이런 식으로 결과를 출력하려 했으나, 어떠한 이유인지 빈 값만 계속 출력되었다.
문법이나 기본 쿼리 구조상은 원인이 없다고 판단. 왜 결과가 안나오는 것일까?
발생 원인
다름이 아닌 LISTAGG 대상 컬럼이 NVARCHAR2 여서 그랬다..
테스트 케이스
with test_table as (
select 1 as num, UNISTR('사과') as name from dual
union all
select 1, UNISTR('배') from dual
union all
select 2, UNISTR('귤') from dual
union all
select 2, UNISTR('참외') from dual
)
select num, listagg(name, ',') within group (order by num) as str
from test_table
group by num;
NVARCHAR2 인 데이터를 LISTAGG 할 시 공백 또는 이상한 문자가 출력될 것이다.
해결 방법
NAVARCHAR2 인 데이터를 VARCHAR2로 변환하여 처리하면 된다.
변환 방법 : CAST(컬럼 AS 데이터타입) - CAST(name AS VARCHAR2(1000))
데이터 크기는 상황에 맞게 적당하게 주면 된다. 부족하면 ORA-01401: inserted value too large for column 에러 발생
with test_table as (
select 1 as num, UNISTR('사과') as name from dual
union all
select 1, UNISTR('배') from dual
union all
select 2, UNISTR('귤') from dual
union all
select 2, UNISTR('참외') from dual
)
select num, listagg(cast(name as varchar2(1000)), ',') within group (order by num) as str
from test_table
group by num;
문법 문제인지, 조인이 잘못된 건지 한참을 검수했는데 허무하게 원인을 발견했다.
728x90
반응형