Как изменить вложенное поле JSONB через jsonb_set в PostgreSQL

Как изменить вложенное поле JSONB через jsonb_set в PostgreSQL
Содержание статьи

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-значение нужного типа

Строка, число, логическое значение и JSON null имеют разный смысл. Например, 'null'::jsonb обозначает JSON null, а SQL NULL является отсутствующим SQL-значением. Не подменяйте одно другим при формировании параметров.

Если документ хранится в таблице, сам вызов функции в SELECT его не сохраняет. Для реального изменения потребуется отдельный UPDATE с подходящим условием. Перед этим проверьте выборку затрагиваемых строк и правила работы с отсутствующим путём.

Задание для самостоятельной проверки

Сравните три документа: с городом, без города, но с profile, и без profile. Для каждого выполните выражение с true и false. Объясните результат до запуска запроса.

Работу с JSONB можно включить в практический курс SQL. Структуру документа и условия изменения обсудите с наставником по SQL.

Похожие статьи по данной теме