Якщо ви зможете оновити до 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
стовпці замінюється на остаточну версію.