본문 바로가기
Oracle

[Oracle] LISTAGG 사용 시 적용 안 되는 케이스(NVARCHAR2)

by 상후 2023. 10. 4.
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
반응형

댓글