2025. 2. 12. 21:29ㆍBACKEND
JSON_ARRAYAGG() 함수와 JSON_OBJECTAGG() 함수는 MySQL에서 JSON 데이터를 집계하는 데 사용되는 함수로, 각각 다른 형태의 JSON 구조를 생성한다. 이 두 함수의 차이점은 생성되는 JSON 데이터의 형태에 있다.
1. JSON_ARRAYAGG()
JSON_ARRAYAGG() 함수는 JSON 배열을 생성, 여러 개의 값을 한 배열로 묶어서 JSON 형태로 반환할 때 사용된다. 쉽게 말해, 특정 컬럼의 값을 순차적으로 모아서 하나의 배열을 만드는 역할을 한다.
예제:
다음과 같은 테이블이 있다고 가정
id name
1 | John |
2 | Jane |
3 | Smith |
이 데이터를 JSON_ARRAYAGG()로 집계하면:
SELECT JSON_ARRAYAGG(name) AS names_array
FROM employees;
결과:
["John", "Jane", "Smith"]
여기서 JSON_ARRAYAGG()는 name 컬럼의 값을 모아 하나의 배열 형태로 반환.
2. JSON_OBJECTAGG()
JSON_OBJECTAGG() 함수는 JSON 객체를 생성. 키-값 쌍을 모아서 하나의 JSON 객체를 만드는 데 사용된다. 즉, 각 행의 데이터를 특정 키와 값으로 구성하여 객체 형태로 반환 한다.
예제:
다음과 같은 테이블이 있다고 가정
id name
1 | John |
2 | Jane |
3 | Smith |
이 데이터를 JSON_OBJECTAGG()로 집계하면:
SELECT JSON_OBJECTAGG(id, name) AS names_object
FROM employees;
결과:
{
"1": "John",
"2": "Jane",
"3": "Smith"
}
여기서 JSON_OBJECTAGG()는 id 컬럼을 키로, name 컬럼을 값으로 사용하여 JSON 객체를 생성 한다.
요약
- JSON_ARRAYAGG(): 특정 컬럼의 여러 값을 모아서 JSON 배열로 반환 한다.
- 예: ["John", "Jane", "Smith"]
- JSON_OBJECTAGG(): 두 개의 컬럼(하나는 키, 하나는 값)을 이용해 JSON 객체를 반환 한다.
- 예: { "1": "John", "2": "Jane", "3": "Smith" }
따라서 JSON_ARRAYAGG()는 여러 값을 리스트 형태로 모아서 반환하는 반면, JSON_OBJECTAGG()는 키-값 쌍으로 구성된 객체 형태로 데이터를 반환 해준다.
배열 안의 JSON 오브젝트가 필요 하다면
나는 처음에는 두 함수를 같이 사용 할 수 있는줄 알았다. 그래서 항상 왜 에러가 생기는지 헷갈렸는데
아쉽게도 JSON_ARRAYAGG(JSON_OBJECTAGG())처럼 두 개의 집계 함수를 직접 중첩하여 사용하는 것은 MySQL에서 지원되지 않는다. 대신, 각 행을 JSON 객체로 만든 다음, 그 객체들을 JSON 배열로 모으는 방식으로 구현할 수 있다 이 경우, JSON_OBJECT()와 JSON_ARRAYAGG()를 조합하여 원하는 형태의 결과를 얻을 수 있다.
예를 들어, 다음과 같은 형태의 배열 안에 JSON 객체들을 만들고 싶다고 가정하자
[
{ "id": 1, "name": "John" },
{ "id": 2, "name": "Jane" },
{ "id": 3, "name": "Smith" }
]
JSON_OBJECT()를 이용해 각 행을 JSON 객체로 만든 후, JSON_ARRAYAGG()로 이 객체들을 배열로 묶으면 된다.
예제
다음과 같은 테이블이 있다고 가정
id name
1 | John |
2 | Jane |
3 | Smith |
이를 배열 안에 JSON 객체로 표현하려면 아래와 같이 사용하면 된다.
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', id,
'name', name
)
) AS result_array
FROM employees;
결과:
[
{ "id": 1, "name": "John" },
{ "id": 2, "name": "Jane" },
{ "id": 3, "name": "Smith" }
]
쿼리 설명
- JSON_OBJECT('id', id, 'name', name):
- 각 행을 JSON 객체로 변환.
- 'id', id와 'name', name을 사용하여 객체의 키와 값을 설정.
- JSON_ARRAYAGG(...):
- 여러 JSON 객체들을 배열로 묶어준다.
각 행이 JSON 객체가 되고, 그 객체들이 모두 하나의 JSON 배열로 묶여 원하는 형태의 결과를 얻을 수 있다.
요약
- JSON_ARRAYAGG() → 컬럼의 여러 값을 모아 JSON 배열로 반환, [’jone’, ‘may’, ‘taylor’]
- JSON_OBJECTAGG() → 두 개의 컬럼(키, 값)을 이용해 JSON 객체를 반환,
- 두 함수는 모두 집계 함수이므로 배열안에 JSON객체를 만들고 싶다면 JSON_ARRAYAGG( JSON_OBJECTAGG() ) 형태로 사용하는 것이 아니라 JSON_ARRAYAGG( JSON_OBJECT(’key’, ‘value’) ) 와 같이 사용해야 한다.
'BACKEND' 카테고리의 다른 글
EXPLAIN 사용법 찍먹 해보기 (0) | 2025.03.26 |
---|---|
Nest, Adonis, Express 비교 하기 (1) | 2024.12.09 |
Nest.js 공부하기 (2) (0) | 2024.11.27 |
Nest.js 공부하기 (1) (3) | 2024.11.04 |
Prisma 공부하기 (3) | 2024.10.20 |