본문 바로가기
SQL

SQL - Array 정리

by sinabeuro 2021. 10. 5.
728x90

SQL Array가 다 비슷비슷해보여서 구분하고 정리할 필요가 있어 포스트합니다.

대표적으로 ARRAY, ARRAY_AGG, ARRAY_TO_STRING, STRING_AGG을 구분하겠습니다.

 

 

ARRAY

ARRAY는 

select ARRAY[1,2,3]::int8[];

와 같이 element를 모아서 배열 형식으로 만들 수 있습니다. 

배열을 만들 때 자료형만 주의하면 손쉽게 데이터를 배열로 호출할 수 있습니다.

 

또한 ARRAY는 서브쿼리를 통해서 배열 데이터를 만들 수 있습니다.

select  ARRAY(select prd_no from tpd_prd limit 5)::integer[]

 

 

ARRAY_AGG

ARRAY_AGG는 ARRAY와 같이 배열을 만들어주지만 차이점이 있습니다.

ARRAY_AGG는 from 절에 조회한 테이블의 데이터를 배열로 만듭니다.

즉, where 조건 절로 걸러진 모집단을 대상으로 배열을 만듭니다.

select
  	ARRAY_AGG(prd_no)
from 
(select prd_no from tpd_prd limit 5) as a;

 

 

ARRAY_TO_STRING

ARRAY_TO_STRING은 배열은 문자열로 바꿀 때 사용합니다.

ARRAY_TO_STRING 첫번째 인자는 배열, 두번째 인자는 구분해줄 구분 기호를 넣습니다.

 

from 절의 모집단을 대상으로 ARRAY_TO_STRING를 적용할 수 있습니다.

select 
	ARRAY_TO_STRING(ARRAY_AGG(prd_no), ',') 
from 
(select prd_no from tpd_prd limit 5) as a;

 

또 다른 방법으로 서브쿼리를 이용해서 ARRAY_TO_STRING를 사용할 수 있습니다.

select ARRAY_TO_STRING(ARRAY(select prd_no from tpd_prd limit 5)::integer[], ',');

 

 

STRING_AGG

STRING_AGG는 from 절에서 조회된 모집단의 배열을 문자열로 만듭니다.

ARRAY_TO_STRING와 유사한 기능을 하지만, 첫인자로 모집단의 데이터를 받는다는 차이가 있습니다.

두번째 인자는 ARRAY_TO_STRING와 같습니다. 

구분자로 사용할 문자를 두번째 인자로 넘겨주면 됩니다.

select
	STRING_AGG(prd_no::varchar, '/')
from 
(select prd_no from tpd_prd limit 5) as a;

 

 

 

비교 예제

select
	ARRAY(select prd_no from tpd_prd limit 5)::integer[],
  	ARRAY_AGG(prd_no),
  	ARRAY_TO_STRING(ARRAY_AGG(prd_no), ','),
  	STRING_AGG(prd_no::varchar, '/')
from 
(select prd_no from tpd_prd limit 5) as a;

 

예제 쿼리의 결과값

ARRAY와 ARRAY_AGG의 결과값이 같습니다. 데이터가 배열로 조회됩니다.

ARRAY_TO_STRING와 STRING_AGG의 결과값이 같습니다. 배열이 문자열 변환하여 조회됩니다.

즉, 문법의 형식적인 차이가 있을 뿐, 조회 데이터는 같습니다. 

그래서 상황에 따라 알맞은 함수를 써서 쿼리문을 작성하면 될 것 같습니다.

728x90

'SQL' 카테고리의 다른 글

SQL - partition by 성능개선  (0) 2021.10.07
SQL - LATERAL  (0) 2021.10.05
SQL - WITH RECURSIVE 문(재귀 쿼리)  (0) 2021.04.23

댓글