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의 결과값이 같습니다. 배열이 문자열 변환하여 조회됩니다.
즉, 문법의 형식적인 차이가 있을 뿐, 조회 데이터는 같습니다.
그래서 상황에 따라 알맞은 함수를 써서 쿼리문을 작성하면 될 것 같습니다.
'SQL' 카테고리의 다른 글
| SQL - partition by 성능개선 (0) | 2021.10.07 |
|---|---|
| SQL - LATERAL (0) | 2021.10.05 |
| SQL - WITH RECURSIVE 문(재귀 쿼리) (0) | 2021.04.23 |
댓글