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