Pokud jste schopni upgradovat na Postgresql 9.5, jsonb_set
příkaz je k dispozici, jak již uvedli ostatní.
V každém z následujících příkazů SQL jsem vynechal where
doložka pro stručnost; samozřejmě byste to chtěli přidat zpět.
Aktualizovat název:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Nahraďte značky (na rozdíl od přidávání nebo odebírání značek):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Nahrazení druhé značky (indexované 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Připojte značku (to bude fungovat, pokud bude méně než 999 značek; změna argumentu 999 na 1000 nebo vyšší způsobí chybu . Zdá se, že toto již není případ Postgres 9.5.3; lze použít mnohem větší index):
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Odstraňte poslední značku:
UPDATE test SET data = data #- '{tags,-1}'
Komplexní aktualizace (smažte poslední značku, vložte novou značku a změňte název):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Je důležité si uvědomit, že v každém z těchto příkladů ve skutečnosti neaktualizujete jediné pole dat JSON. Místo toho vytváříte dočasnou upravenou verzi dat a přiřazujete tuto upravenou verzi zpět ke sloupci. V praxi by měl být výsledek stejný, ale s ohledem na to by komplexní aktualizace, jako je poslední příklad, měly být srozumitelnější.
Ve složitém příkladu existují tři transformace a tři dočasné verze:Nejprve je odstraněna poslední značka. Poté se tato verze transformuje přidáním nové značky. Dále je druhá verze transformována změnou name
pole. Hodnota v data
sloupec je nahrazen konečnou verzí.