När vi använder SQLite kan vi använda följande metoder för att extrahera data från ett JSON-dokument.
json_extract() Funktion
Som namnet antyder, json_extract() funktion extraherar och returnerar ett eller flera värden från välformad JSON.
Exempel:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
); Resultat:
{"name":"Bark","scores":[3,4,8,7]}
Matriser är nollbaserade, så räkningen börjar vid 0 . Därför angav vi [1] för att få det andra elementet inom hundar array, som råkar vara ett JSON-objekt.
Vi kan bara returnera namnet på hunden på den positionen i arrayen genom att lägga till i vår sökväg:
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'
); Resultat:
Bark
Vi kan använda json_extract() för att returnera flera sökvägar:
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'
); Resultat:
["Wag","Bark","Woof"]
När vi extraherar värden från flera sökvägar, returneras värdena i en array.
-> Operatör
Därför kan vi ändra det första exemplet till detta:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]'; Resultat:
{"name":"Bark","scores":[3,4,8,7]}
json_extract() funktion:
-
-> operatorn returnerar alltid en JSON-representation av underkomponenten. json_extract()Funktionen returnerar endast JSON om det finns två eller flera sökvägsargument (eftersom resultatet då är en JSON-matris) eller om det enkla sökvägsargumentet refererar till en matris eller ett objekt.- Om det bara finns ett sökvägsargument och den sökvägen refererar till en JSON-null eller en sträng eller ett numeriskt värde, då
json_extract()returnerar motsvarande SQL NULL-, TEXT-, INTEGER- eller REAL-värde.
Därför är det här vad som händer när vi extraherar en hunds namn från vår JSON:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name'; Resultat:
"Bark"
Den här gången är den omgiven av citat. Det beror på att det returnerade en JSON-representation av värdet. När vi extraherade samma värde med json_extract() tidigare fick vi en SQL-representation av värdet.
Men vi kan också använda
->> Operatör
-> operator, förutom att ->> returnerar en SQL-representation av den angivna underkomponenten. Specifikt returnerar den en SQL-TEXT , INTEGER , REAL , eller NULL värde som representerar den valda underkomponenten, eller NULL om underkomponenten inte finns.
Därför är det här vad som händer när vi använder ->> operatör för att extrahera hundens namn:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name'; Resultat:
Bark
Det står inte längre inom citattecken.