Ако можете да надстроите до 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
колоната се заменя с окончателната версия.