JSONsolo PostgreSQL

JSONB_BUILD_OBJECT

Construye un objeto JSON a partir de pares clave–valor.

Sintaxis

JSONB_BUILD_OBJECT(<clave1>, <valor1>, <clave2>, <valor2>, …)

Los argumentos van por parejas: una clave y luego su valor. Los números siguen siendo números; el texto, cadenas; NULL, null. Útil para enviar datos a la aplicación en un solo campo JSON o reunir varias columnas en un objeto.

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.

Un objeto a partir de pares
SELECT JSONB_BUILD_OBJECT('name', 'Emma', 'salary', 1200) AS employee;
employee
{"name":"Emma","salary":1200}
Un objeto para cada empleado
SELECT JSONB_BUILD_OBJECT('name', name, 'department', department, 'phone', phone) AS employee
FROM employees;
employee
{"name":"Emma","phone":"+44 7700 900123","department":"backend"}
{"name":"Liam","phone":null,"department":"backend"}
{"name":"Olivia","phone":"+44 7700 900456","department":"frontend"}
{"name":"Noah","phone":"+44 7700 900789","department":"frontend"}
{"name":"Sophia","phone":null,"department":"design"}

Donde no hay teléfono, el JSON tiene null.

Sacar de nuevo un valor del objeto
SELECT JSONB_BUILD_OBJECT('name', 'Emma', 'salary', 1200) ->> 'name' AS name;
name
Emma

->> obtiene el valor de una clave como texto.

Ten en cuenta

El número de argumentos debe ser par: JSONB_BUILD_OBJECT('name', 'Emma', 'salary') da el error argument list must have even number of elements.

jsonb ordena las claves por su cuenta y no guarda repetidas: JSONB_BUILD_OBJECT('b', 1, 'a', 2) muestra {"a": 2, "b": 1}. El orden en que se escribieron lo conserva JSON_BUILD_OBJECT, sin la B.

-> devuelve jsonb, y ->>, texto. Para comparar con una cadena o hacer cálculos necesitas ->> y, para números, además una conversión: (employee ->> 'salary')::int.