Как я могу изменить / обновить несколько значений в массиве json - PullRequest
1 голос
/ 14 октября 2019

Допустим, у меня есть столбец jsonb базы данных с массивом json в следующем формате:

[
  {
    "test1key": "test1Value"
  },
  {
    "test2key": "test2Value"
  },
  {
    "test3key": "test3Value"
  }
]

Возможно ли в одном запросе обновить значение "test1key ", а также" test2key "? Если да, то как?

1 Ответ

1 голос
/ 14 октября 2019

Главный вопрос: зачем вам это делать? Структура JSON излишне сложна и нелогична. Вы должны сохранять данные JSON как можно более простыми. Вы можете хранить те же данные в одном объекте:

{"test1key": "test1Value", "test2key": "test2Value", "test3key": "test3Value"}

, и тогда обновление будет таким же простым, как

update my_table
set json_col = json_col || '{"test1key": "newValue1", "test2key": "newValue2"}'
where id = 1

Даже если данные поступают извне, вы всегда можете преобразовать ихв более простую и эффективную форму перед сохранением в базе данных. Слишком сложная структура данных делает ее обработку (особенно обновления) трудной и неэффективной:

update my_table t1
set json_col = new_array
from (
    select id, jsonb_agg(jsonb_build_object(old_key, coalesce(new_value, old_value))) as new_array
    from my_table
    cross join jsonb_array_elements(json_col) as a(elem)
    cross join jsonb_each_text(elem) as e(old_key, old_value)
    left join jsonb_each_text(
        '{"test1key": "newValue1", "test2key": "newValue2"}'
        ) as v(new_key, new_value) 
    on old_key = new_key
    group by id
    ) t2
where t1.id = 1 and t2.id = t1.id;

Демонстрация в Интернете: db <> fiddle.

...