JSONлише PostgreSQL

JSONB_BUILD_OBJECT

Складає JSON-об'єкт із пар «ключ — значення».

Синтаксис

JSONB_BUILD_OBJECT(<ключ1>, <значення1>, <ключ2>, <значення2>, …)

Аргументи йдуть парами: ключ, потім його значення. Числа лишаються числами, текст — рядками, NULL — null. Зручно, щоб віддати дані застосунку одним JSON-полем або зібрати кілька стовпців в один об'єкт.

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

employees

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

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

Об'єкт із пар
SELECT JSONB_BUILD_OBJECT('name', 'Emma', 'salary', 1200) AS employee;
employee
{"name":"Emma","salary":1200}
Об'єкт для кожного працівника
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"}

Де телефону нема, у JSON стоїть null.

Значення з об'єкта — назад
SELECT JSONB_BUILD_OBJECT('name', 'Emma', 'salary', 1200) ->> 'name' AS name;
name
Emma

->> дістає значення за ключем як текст.

Зверни увагу

Аргументів має бути парна кількість: JSONB_BUILD_OBJECT('name', 'Emma', 'salary') дасть помилку argument list must have even number of elements.

jsonb сам упорядковує ключі й не тримає повторів: JSONB_BUILD_OBJECT('b', 1, 'a', 2) покаже {"a": 2, "b": 1}. Порядок, як написано, зберігає JSON_BUILD_OBJECT — без B.

-> повертає jsonb, а ->> — текст. Для порівняння з рядком чи обчислень потрібен ->>, а для чисел ще й приведення: (employee ->> 'salary')::int.