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

3 modi per estrarre un valore da un documento JSON in SQLite

Quando si utilizza SQLite, è possibile utilizzare i seguenti metodi per estrarre i dati da un documento JSON.

Il json_extract() Funzione

Come suggerisce il nome, json_extract() la funzione estrae e restituisce uno o più valori da JSON ben formato.

Esempio:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Risultato:

{"name":"Bark","scores":[3,4,8,7]}

Gli array sono a base zero, quindi il conteggio inizia da 0 . Pertanto, abbiamo specificato [1] per ottenere il secondo elemento all'interno di dogs array, che risulta essere un oggetto JSON.

Possiamo restituire solo il nome del cane in quella posizione nell'array aggiungendo al nostro percorso:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Risultato:

Bark

Possiamo usare json_extract() per restituire più percorsi:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);

Risultato:

["Wag","Bark","Woof"]

Quando estraiamo valori da più percorsi, i valori vengono restituiti in una matrice.

Il -> Operatore

Il -> estrae un sottocomponente da un documento JSON e restituisce una rappresentazione JSON di quel sottocomponente.

Pertanto, possiamo cambiare il primo esempio in questo:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1]';

Risultato:

{"name":"Bark","scores":[3,4,8,7]}

Il -> l'operatore è leggermente diverso da json_extract() funzione:

  • Il -> l'operatore restituisce sempre una rappresentazione JSON del sottocomponente.
  • Il json_extract() La funzione restituisce JSON solo se sono presenti due o più argomenti di percorso (perché il risultato è quindi una matrice JSON) o se l'argomento di percorso singolo fa riferimento a una matrice o a un oggetto.
  • Se c'è un solo argomento di percorso e quel percorso fa riferimento a un valore JSON null o una stringa o un valore numerico, allora json_extract() restituisce il valore SQL NULL, TEXT, INTEGER o REAL corrispondente.

Pertanto, ecco cosa succede quando estraiamo il nome di un cane dal nostro JSON:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1].name';

Risultato:

"Bark"

Questa volta è circondato da virgolette. Questo perché ha restituito una rappresentazione JSON del valore. Quando abbiamo estratto lo stesso valore con json_extract() in precedenza, abbiamo ottenuto una rappresentazione SQL del valore.

Tuttavia, possiamo anche utilizzare il ->> operatore per restituire una rappresentazione SQL.

Il ->> Operatore

Il ->> l'operatore funziona allo stesso modo di -> operatore, tranne che ->> restituisce una rappresentazione SQL del sottocomponente specificato. In particolare, restituisce un SQL TEXT , INTEGER , REAL o NULL valore che rappresenta il sottocomponente selezionato o NULL se il sottocomponente non esiste.

Pertanto, ecco cosa succede quando utilizziamo il ->> operatore per estrarre il nome del cane:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' ->> '$.dogs[1].name';

Risultato:

Bark

Non è più racchiuso tra virgolette.