SQLite
 sql >> Database >  >> RDS >> SQLite

SQLite JSON_REPLACE()

Il json_replace() di SQLite La funzione ci consente di sostituire un valore esistente in un documento JSON con un altro valore.

Passiamo il JSON originale come primo argomento quando chiamiamo la funzione, seguito dal percorso del valore da sostituire, seguito dal valore da sostituire.

Se necessario, possiamo anche sostituire più coppie chiave/valore.

Sintassi

Funziona così:

json_replace(json, path1, value1, path2, value2...)

Dove json rappresenta il JSON originale e path1, value1, path2, value2... sono coppie percorso/valore da sostituire.

Esempio

Ecco un esempio di base da dimostrare:

SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");

Risultato:

{"name":"Baldy"}

Qui ho aggiornato il valore del name chiave da Fluffy a Baldy .

Possiamo aggiornare più coppie chiave/valore in questo modo:

SELECT json_replace('{ 
    "name" : "Fluffy", 
    "age" : 10
    }', 
    '$.name', "Baldy", 
    '$.age', 11 
    );

Risultato:

{"name":"Baldy","age":11}

Ho semplicemente aggiunto più argomenti chiave/valore quando ho chiamato json_replace() .

Qui, ho usato le interruzioni di riga per rendere il codice più facile da leggere. Avrebbe potuto essere tutto su una riga:il risultato sarebbe stato lo stesso.

E se la chiave non esiste?

Se la chiave non esiste già nel JSON, non viene sostituito nulla:

SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);

Risultato:

{"name":"Fluffy"}

Questa è la caratteristica principale che contraddistingue il json_replace() funzione da json_set() e json_insert() funzioni. Tali funzioni inseriranno il valore se la chiave non esiste già.

Tuttavia, è possibile inserire in modo efficace nuove chiavi con json_replace() sostituendo l'intero oggetto/documento JSON. Esempio sotto.

Sostituisci l'intero documento JSON

Possiamo usare json_replace() per sostituire l'intero documento JSON con un altro:

SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );

Risultato:

{"name":"Baldy"}

Quindi questo ci consente di inserire efficacemente nuove chiavi nel documento:

SELECT json_replace('{ 
    "name" : "Fluffy" 
    }', 
    '$', 
    json('{ 
        "name" : "Baldy" ,
        "age" : 11
        }'
    ) 
);

Risultato:

{"name":"Baldy","age":11}

A rigor di termini, non abbiamo inserito nuove chiavi. Abbiamo semplicemente sostituito l'intero documento. Ma il risultato è stato un documento JSON che contiene chiavi che l'originale non conteneva.

Sostituisci un oggetto incorporato

Possiamo anche sostituire gli oggetti incorporati:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    json('{ "c" : 2 }') 
    );

Risultato:

{"a":1,"b":{"c":2}}

Quando l'ho fatto, ho usato json() funzione per restituire il mio argomento come stringa JSON. Ecco cosa succede quando non lo faccio:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    '{ "c" : 2 }' 
    );

Risultato:

{"a":1,"b":"{ \"c\" : 2 }"}

Il documento JSON viene inserito come valore di testo invece di un oggetto JSON e le sue virgolette doppie vengono quindi salvate con barre inverse.

Tuttavia, non possiamo semplicemente rimuovere le virgolette singole, perché ciò provoca un errore:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    { "c" : 2 }
    );

Risultato:

Parse error: unrecognized token: "{"
        "b" : { "c" : 1 }      }',      '$.b',      { "c" : 2 }     );
                                      error here ---^

Senza virgolette singole o json() funzione, otteniamo un errore non appena incontra la parentesi graffa sinistra. Abbiamo quindi bisogno di usare virgolette singole o json() funzione, a seconda che stiamo inserendo un oggetto JSON o un valore di stringa/testo SQL.

Un altro modo per inserire un oggetto JSON è utilizzare json_object() funzione invece di json() funzione:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 1 } 
    }', 
    '$.b', 
    json_object('c', 2) 
    );

Risultato:

{"a":1,"b":{"c":2}}

Sostituisci un array

Lo stesso concetto si applica agli array:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));

Risultato:

{"a":[5,6,7]}

Se rimuoviamo json() funzione, otteniamo questo:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');

Risultato:

{"a":"[ 5, 6, 7 ]"}

E se rimuoviamo le virgolette singole, otteniamo un errore:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);

Risultato:

Parse error: no such column:  5, 6, 7  (17)
  LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
                                      error here ---^

In alternativa possiamo usare json_array() funzione invece di json() . Quella funzione ti consente di creare un array basato sui suoi argomenti:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));

Risultato:

{"a":[5,6,7]}

Aggiungi valori alla fine di un array

Per aggiungere valori alla fine di un array, possiamo usare il json_insert() o json_set() funzioni.

Tuttavia, se dobbiamo usare json_replace() , possiamo sostituire l'intero array con un altro che ha il/i valore/i extra aggiunto/i alla fine dell'array:

SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );

Risultato:

[1,2,3,4]

Ma come accennato, json_insert() e json_set() consentono di aggiungere effettivamente valori all'array senza sostituire l'intero array.

Sostituisci gli elementi dell'array

Ecco un esempio di utilizzo di json_replace() per sostituire un elemento all'interno di un array:

SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );

Risultato:

[1,4,3]

Gli array sono a base zero, quindi [1] indica il secondo elemento dell'array.

Il json_set() la funzione può essere utilizzata anche per sostituire elementi esistenti. Tuttavia, il json_insert() la funzione non ci consente di sostituire elementi esistenti.

Percorsi non validi

Riceveremo un errore se il nostro percorso non è ben formato:

SELECT json_replace('{ "a" : 1 }', 'a', 2);

Risultato:

Runtime error: JSON path error near 'a'

In questo caso, ho dimenticato di includere $. all'inizio del sentiero.

Documenti JSON non validi

Riceveremo anche un errore che JSON non è ben formato:

SELECT json_replace('{ "a" : 1', '$.a', 2);

Risultato:

Runtime error: malformed JSON

Questa volta l'errore ci dice che il nostro JSON non è corretto.