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

Operatore

In SQLite, il ->> estrae un sottocomponente da un documento JSON e restituisce una rappresentazione SQL di quel sottocomponente.

Il ->> operatore è stato introdotto per la prima volta in SQLite versione 3.38.0 (rilasciato il 22 febbraio 2022).

Sintassi

La sintassi è questa:

json ->> path

Dove json è il documento JSON e il path è il percorso del sottocomponente che vogliamo estrarre da esso.

Quindi forniamo un documento JSON alla sinistra dell'operatore e specifichiamo il percorso che vogliamo estrarre alla sua destra.

Il ->> operatore restituisce sempre una rappresentazione SQL del sottocomponente specificato. Per restituire una rappresentazione JSON, utilizza -> operatore invece.

Esempi

Ecco un semplice esempio per dimostrare come il ->> operatore lavora:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';

Risultato:

{"name":"Wag","type":"Dog"}

In questo caso, ho specificato un percorso di '$' che restituisce l'intero documento.

Specifichiamo un altro percorso:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';

Risultato:

Dog

Possiamo anche omettere del tutto il simbolo del dollaro e il punto, in questo modo:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';

Risultato:

Dog

Eccolo con un documento JSON più grande:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0]';

Risultato:

{"user":"Spike","age":30,"scores":[9,7,3]}

In SQLite, gli array sono a base zero e quindi specificando [0] restituisce il primo elemento dell'array.

Se volessimo solo ottenere i punteggi di quell'utente, potremmo farlo:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores';

Risultato:

[9,7,3]

Possiamo andare ancora più in profondità ed estrarre un punteggio specifico:

SELECT '[
        { 
        "user" : "Spike",
        "age" : 30,
        "scores" : [ 9, 7, 3 ]
        },
        { 
        "user" : "Faye",
        "age" : 25,
        "scores" : [ 90, 87, 93 ]
        },
        { 
        "user" : "Jet",
        "age" : 40,
        "scores" : [ 50, 38, 67 ]
        }
        ]' ->> '$[0].scores[1]';

Risultato:

7

Percorso inesistente

Se il percorso non esiste nel JSON, viene restituito un valore null:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';

Risultato:

null

Nota che in SQLite puoi usare .nullvalue per specificare una stringa da restituire ogni volta che viene restituito un valore null. Nel mio caso, avevo precedentemente eseguito il seguente comando:

.nullvalue null

Ciò specifica che il testo null dovrebbe essere emesso ogni volta che viene restituito un valore nullo. Ecco perché l'esempio sopra emette il testo null . Se non l'avessi fatto, il risultato avrebbe potuto essere vuoto.

JSON non valido

Se il primo argomento non è un JSON valido, viene generato un errore:

SELECT '{ "name" }' ->> '$';

Risultato:

Runtime error: malformed JSON

Percorso non valido

E se il secondo argomento non è un percorso valido, viene generato un errore:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';

Risultato:

Runtime error: JSON path error near 'name'

In questo caso, ho dimenticato di inserire il punto (. ) tra il simbolo del dollaro ($ ) e name .

Tuttavia, come accennato, è possibile omettere del tutto il simbolo del dollaro e il punto:

SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';

Risultato:

Wag