PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eseguire operazioni di aggiornamento su colonne di tipo JSONB in ​​Postgres 9.4

Se riesci a eseguire l'aggiornamento a Postgresql 9.5, il jsonb_set il comando è disponibile, come altri hanno già detto.

In ciascuna delle seguenti istruzioni SQL, ho omesso il where clausola di brevità; ovviamente, vorresti aggiungerlo di nuovo.

Aggiorna nome:

UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');

Sostituisci i tag (anziché aggiungere o rimuovere tag):

UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');

Sostituzione del secondo tag (0-indicizzato):

UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');

Aggiungi un tag (funzionerà finché 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; può essere utilizzato un indice molto più grande):

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 cambia 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 non stai effettivamente aggiornando un singolo campo dei dati JSON. Invece, stai creando una versione temporanea e modificata dei dati e riassegnando quella versione modificata alla colonna. In pratica il risultato dovrebbe essere lo stesso, ma tenendo presente questo 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 cambiando il name campo. Il valore nei data la colonna viene sostituita con la versione finale.