JSONлише PostgreSQL

JSONB_AGG

Збирає значення з багатьох рядків в один JSON-масив.

Синтаксис

JSONB_AGG(<вираз>)
JSONB_AGG(<вираз> ORDER BY <критерій>)

Як ARRAY_AGG, але результат — JSON-масив, який зручно одразу віддати застосунку. Разом із JSONB_BUILD_OBJECT збирає цілі списки об'єктів: відділ і всіх його людей в одному полі.

Дані для прикладів

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Усі імена в JSON-масив
SELECT JSONB_AGG(name) AS names
FROM employees;
names
["Emma","Liam","Olivia","Noah","Sophia"]
Список людей у кожному відділі
SELECT department,
JSONB_AGG(name ORDER BY name) AS team
FROM employees
GROUP BY department
ORDER BY department;
departmentteam
backend["Emma","Liam"]
design["Sophia"]
frontend["Noah","Olivia"]
Відділи з об'єктами людейСкладніше
SELECT department,
JSONB_AGG(JSONB_BUILD_OBJECT('name', name, 'salary', salary) ORDER BY salary DESC) AS team
FROM employees
GROUP BY department
ORDER BY department;
departmentteam
backend[{"name":"Emma","salary":1200},{"name":"Liam","salary":1000}]
design[{"name":"Sophia","salary":1200}]
frontend[{"name":"Olivia","salary":1350},{"name":"Noah","salary":950}]

Така форма зручна для API: один рядок на відділ, а люди — масивом об'єктів усередині.

Зверни увагу

NULL не пропускаються, а стають null у масиві. Прибрати їх — JSONB_AGG(phone) FILTER (WHERE phone IS NOT NULL).

Якщо рядків нема, результат — NULL, а не порожній масив. Потрібен [] — COALESCE(JSONB_AGG(…), '[]').

Без ORDER BY у дужках порядок елементів не гарантований.

Схожі функції