Если вы можете обновить до Postgresql 9.5, jsonb_set
команда доступна, как уже упоминали другие.
В каждом из следующих операторов SQL where
для краткости я опустил этот пункт; очевидно, вы захотите добавить это обратно.
Название обновления:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Замените теги (в отличие от добавления или удаления тегов):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Замена второго тега (с индексом 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Добавить тег ( это будет работать, пока тегов меньше 999; изменение аргумента с 999 на 1000 или выше вызывает ошибку . В Postgres 9.5.3 этого больше нет; можно использовать гораздо больший индекс) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Удалите последний тег:
UPDATE test SET data = data #- '{tags,-1}'
Комплексное обновление (удалить последний тег, вставить новый тег и изменить имя):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Важно отметить, что в каждом из этих примеров вы не обновляете ни одного поля данных JSON. Вместо этого вы создаете временную измененную версию данных и назначаете эту измененную версию обратно столбцу. На практике результат должен быть таким же, но, учитывая это, комплексные обновления, такие как последний пример, будут более понятными.
В сложном примере есть три преобразования и три временных версии: во-первых, удаляется последний тег. Затем эта версия преобразуется путем добавления нового тега. Далее вторая версия трансформируется путем изменения name
поля. Значение в data
столбце заменяется окончательной версией.