


jsonb_set возвращает JSONB с заменённым значением по заданному пути. Функция полезна, когда нужно изменить отдельное поле документа и сохранить остальные. В примерах Mentoring.digital используем SELECT, поэтому запросы не изменяют данные в таблицах.
SELECT jsonb_set(
'{"profile":{"name":"Ada","city":"Kazan"},"active":true}'::jsonb,
'{profile,city}',
to_jsonb('Perm'::text),
false
);Путь '{profile,city}' имеет тип массива текстовых элементов: сначала поле profile, затем city. Новое значение тоже должно быть JSONB. Вызов to_jsonb('Perm'::text) создаёт JSON-строку из SQL-строки.
В результате город станет "Perm", а имя и поле active сохранятся. На порядок ключей в текстовом представлении JSONB полагаться не следует.
SELECT jsonb_set(
'{"profile":{"name":"Ada"}}'::jsonb,
'{profile,city}',
to_jsonb('Perm'::text),
true
);
SELECT jsonb_set(
'{}'::jsonb,
'{profile,city}',
to_jsonb('Perm'::text),
true
);Первый запрос добавит city, потому что родительский объект profile уже существует. Второй вернёт исходный пустой объект: параметр true не создаёт всю недостающую цепочку родителей. Все промежуточные шаги пути должны существовать.
Четвёртый параметр create_if_missing по умолчанию равен true. Значение false запрещает добавление отсутствующего конечного элемента. Используйте его, если по правилам задачи разрешено только менять уже существующее поле.
Строка, число, логическое значение и JSON null имеют разный смысл. Например, 'null'::jsonb обозначает JSON null, а SQL NULL является отсутствующим SQL-значением. Не подменяйте одно другим при формировании параметров.
Если документ хранится в таблице, сам вызов функции в SELECT его не сохраняет. Для реального изменения потребуется отдельный UPDATE с подходящим условием. Перед этим проверьте выборку затрагиваемых строк и правила работы с отсутствующим путём.
Сравните три документа: с городом, без города, но с profile, и без profile. Для каждого выполните выражение с true и false. Объясните результат до запуска запроса.
Работу с JSONB можно включить в практический курс SQL. Структуру документа и условия изменения обсудите с наставником по SQL.