Как обновить несколько полей json на корневом уровне с помощью Postgres? - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь обновить поля age и city одного фида json, используя:

select jsonb_set(d,'{0,age,city}',d || '{"age":30,"city":"los angeles"}') 
from (
  values ('{"name":"john", "age":26,"city":"new york city"}'::jsonb)
) t(d);

, но я получаю:

{"age": 26, "city": "new york city", "name": "john"}

вместоожидаемое:

{"age": 30, "city": "los angeles", "name": "john"}

, что означает, что ни одно из требуемых полей не было обновлено.

Я уже просматривал:

postgres jsonb_set несколько ключей обновления

и прошел соответствующую документацию, но я не могу понять это правильно.Любая помощь?

1 Ответ

0 голосов
/ 23 ноября 2018

С документация:

Все элементы параметра path jsonb_set, а также jsonb_insert, кроме последнего элемента, должны присутствовать вцель.

Путь, указанный в запросе, не соответствует вышеуказанному условию.На самом деле, jsonb_set() не работает для объектов на корневом уровне, и единственный способ - использовать оператор ||:

select d || '{"age":30,"city":"los angeles"}'
from (
    values ('{"name":"john", "age":26,"city":"new york city"}'::jsonb)
) t(d);

                      ?column?                      
----------------------------------------------------
 {"age": 30, "city": "los angeles", "name": "john"}
(1 row) 

Возможно, было бы логично, чтобы вы могли использовать пустой путь

select jsonb_set(d, '{}', d || '{"age":30,"city":"los angeles"}')

К сожалению, разработчики jsonb не предоставили такой возможности.

...