Сохраните и обновите значение jsonb в Postgres - PullRequest
0 голосов
/ 22 марта 2019

У меня есть таблица, такая как:

ID | Details
1  | {"name": "my_name", "phone": "1234", "address": "my address"}
2  | {"name": "his_name", "phone": "4321", "address": "his address"}

Здесь Details - это объект jsonb. Я хочу добавить еще одно поле с именем 'tags' в jsonb, которое должно иметь некоторые конкретные ключи. В данном случае «имя», «телефон». Конечное состояние после выполнения запроса должно быть:

 ID | Details
 1  | {"tags": {"name": "my_name", "phone": "1234"},"name": "my_name", "phone": "1234", "address":"my address"}
 2  | {"tags": {"name": "his_name", "phone": "4321"},"name": "his_name", "phone": "4321", "address":"his address"}

Я могу подумать о следующих шагах, чтобы сделать это:

  • Зацикливайтесь на каждой строке и извлекайте детали ["name"] и детали ["phone"] в переменных.
  • Добавьте эти переменные в jsonb.

Не могу представить, каким должен быть соответствующий запрос postgres для этого. Пожалуйста, руководство.

Ответы [ 3 ]

1 голос
/ 22 марта 2019

использование jsonb_build_object

update t set details 
               = jsonb_build_object ( 'tags',
            jsonb_build_object( 'name', details->>'name', 'phone',details->>'phone')
                  ) 
|| details

DEMO

1 голос
/ 22 марта 2019

Конечно, используйте оператор сцепления!

https://www.postgresql.org/docs/current/functions-json.html

update t1 set details = details || '{"tags": {"name": "my_name"}}' where id = 1
0 голосов
/ 22 марта 2019

Вы можете извлечь интересующие вас ключи, создать новое значение json и добавить его в столбец:

update the_table
  set details = details || jsonb_build_object('tags', 
                               jsonb_build_object('name', details -> 'name', 
                                                  'phone', details -> 'phone'));
...