Se riesci ad aggiornare a Postgresql 9.5, il jsonb_set
comando è disponibile, come altri hanno già detto.
In ognuna delle seguenti istruzioni SQL, ho omesso il where
clausola per brevità; ovviamente, vorresti aggiungerlo di nuovo.
Nome aggiornamento:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Sostituisci i tag (invece di aggiungere o rimuovere tag):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Sostituzione del secondo tag (indicizzato 0):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Aggiungi un tag ( funzionerà fintanto che ci sono meno di 999 tag; la modifica dell'argomento da 999 a 1000 o superiore genera un errore . Questo non sembra più essere il caso in Postgres 9.5.3; un indice molto più grande può essere utilizzato) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Rimuovi l'ultimo tag:
UPDATE test SET data = data #- '{tags,-1}'
Aggiornamento complesso (elimina l'ultimo tag, inserisci un nuovo tag e modifica il nome):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
È importante notare che in ciascuno di questi esempi, in realtà non si sta aggiornando un singolo campo dei dati JSON. Invece, stai creando una versione temporanea e modificata dei dati e assegnando quella versione modificata alla colonna. In pratica, il risultato dovrebbe essere lo stesso, ma tenendo presente ciò dovrebbe rendere più comprensibili gli aggiornamenti complessi, come l'ultimo esempio.
Nell'esempio complesso, ci sono tre trasformazioni e tre versioni temporanee: in primo luogo, l'ultimo tag viene rimosso. Quindi, quella versione viene trasformata aggiungendo un nuovo tag. Successivamente, la seconda versione viene trasformata modificando il name
campo. Il valore nella data
colonna viene sostituito con la versione finale.