PostgreSQL - Как обновить вложенные элементы JSONB - PullRequest
0 голосов
/ 21 марта 2020

Я нашел некоторую информацию, но некоторые из них не были четко объяснены или примеры были непонятны. Этот пример был успешно выполнен на PostgreSQL 12. Требуется частично изменить структуру JSON с PostgreSQL. JSONB используется в качестве типа данных.

Структура данных имеет следующий вид

{
   "id":1,
   "person":{
      "name":"fred"
   }
}

Запись данных должна быть изменена. Необходимо изменить свойство $.person.name и добавить $.person.gender.

select '{"id":1, "person" : {  "name" : "fred" } }'::jsonb || '{"person": { "name" : "lisa", "gender" : "F" }}'::jsonb

Результат содержит соответствующие изменения.

{
   "id":1,
   "person":{
      "name":"lisa",
      "gender":"F"
   }
}

Оператор обновления для столбца JSONB data выглядит так

update t_person set data = data || '{"person": { "name" : "lisa", "gender" : "F" }}'::jsonb

1 Ответ

0 голосов
/ 21 марта 2020

Вы можете просто сбросить весь атрибут person с помощью jsonb_set():

select jsonb_set(
    '{"id":1, "person" : { "name" : "fred" } }'::jsonb,
    '{person}',
    '{ "name":"lisa", "gender":"F" }'::jsonb
)

Демонстрация на DB Fiddle :

| jsonb_set                                            |
| :--------------------------------------------------- |
| {"id": 1, "person": {"name": "lisa", "gender": "F"}} |
...