JSONsolo PostgreSQL

JSONB_AGG

Reúne valores de muchas filas en un solo array JSON.

Sintaxis

JSONB_AGG(<expresión>)
JSONB_AGG(<expresión> ORDER BY <criterio de orden>)

Como ARRAY_AGG, pero el resultado es un array JSON que se puede enviar directamente a la aplicación. Junto con JSONB_BUILD_OBJECT reúne listas enteras de objetos: un departamento y todas sus personas en un solo campo.

Datos para los ejemplos

employees

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

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

Todos los nombres en un array JSON
SELECT JSONB_AGG(name) AS names
FROM employees;
names
["Emma","Liam","Olivia","Noah","Sophia"]
La lista de personas de cada departamento
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"]
Departamentos con objetos de sus personasAvanzado
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}]

Esta forma es cómoda para una API: una fila por departamento, con las personas como array de objetos dentro.

Ten en cuenta

Los NULL no se saltan, sino que se convierten en null dentro del array. Para quitarlos: JSONB_AGG(phone) FILTER (WHERE phone IS NOT NULL).

Si no hay filas, el resultado es NULL, no un array vacío. Si necesitas []: COALESCE(JSONB_AGG(…), '[]').

Sin ORDER BY dentro de los paréntesis, el orden de los elementos no está garantizado.