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

SQLite JSON_EXTRACT()

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

Passiamo il JSON come argomento quando chiamiamo la funzione e restituisce il/i valore/i applicabile/i.

Possiamo specificare uno o più percorsi da estrarre dal documento JSON.

Sintassi

La sintassi è questa:

json_extract(X,P1,P2,...)

Dove X rappresenta il documento JSON e P1,P2,... sono percorsi che possiamo utilizzare per estrarre parti specifiche del documento JSON.

Esempi

Ecco un esempio di base da dimostrare:

SELECT json_extract('{ "a" : 1 }', '$');

Risultato:

{"a":1}

Qui, ho specificato un percorso di $ , che restituisce l'intero documento JSON.

Ecco un esempio con un documento JSON più grande:

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

Risultato:

{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}

Cambiamo il percorso in modo da restituire solo i dogs matrice:

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

Risultato:

[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]

Selezioniamo uno degli elementi all'interno dell'array:

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.

Andiamo ancora più in profondità e restituiamo solo il nome del cane in quella posizione nell'array:

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

Specifica percorsi multipli

Il json_extract() la funzione ci consente di selezionare 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"]

In questo caso, ho restituito i nomi di tutti i cani nel dogs matrice.

Tutti i nomi dei cani vengono restituiti in un array.

Selezione di un percorso inesistente

Se indichiamo un percorso che non esiste, null viene restituito.

Per prima cosa, impostiamo .nullvalue a NULL :

.nullvalue NULL

Il .nullvalue Il comando dot ci consente di fornire una stringa che verrà utilizzata per sostituire i valori null. È uno dei diversi modi in cui puoi sostituire i valori null con una stringa in SQLite. In questo caso, l'ho impostato su NULL . Ora, qualsiasi valore nullo restituirà NULL invece di un risultato vuoto.

Ora chiamiamo json_extract() , ma usa un secondo argomento che punta a un percorso inesistente:

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

Risultato:

NULL

Percorsi non validi

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

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

Risultato:

Runtime error: JSON path error near 'dogs'

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_extract('{ "Dogs" : }', 
'$'
);

Risultato:

Runtime error: malformed JSON

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

Tipi di reso

La documentazione di SQLite afferma quanto segue:

Se viene fornito un solo percorso P1, il tipo di dati SQL del risultato è NULL per un valore JSON null, INTEGER o REAL per un valore numerico JSON, uno zero INTEGER per un valore JSON falso, uno INTEGER per un valore JSON true, il testo tra virgolette per un valore di stringa JSON e una rappresentazione di testo per oggetti JSON e valori di matrice. Se sono presenti più argomenti di percorso (P1, P2 e così via), questa routine restituisce il testo SQLite che è un array JSON ben formato che contiene i vari valori.

Compatibilità MySQL

La documentazione di SQLite ci avverte anche di una sottile incompatibilità tra le implementazioni SQLite e MySQL di json_extract() funzione.

Nello specifico si afferma:

La versione MySQL di json_extract() restituisce sempre JSON. La versione SQLite di json_extract() restituisce JSON solo se sono presenti due o più argomenti PATH (perché il risultato è quindi un array JSON) o se il singolo argomento PATH fa riferimento a un array o a un oggetto. In SQLite, se json_extract() ha un solo argomento PATH e tale PATH fa riferimento a un valore JSON null o a una stringa oa un valore numerico, json_extract() restituisce il valore SQL NULL, TEXT, INTEGER o REAL corrispondente.

Fondamentalmente, questa differenza diventa evidente solo quando si accede a singoli valori all'interno del JSON che sono stringhe o NULL.