In SQLite is de ->>
operator extraheert een subcomponent uit een JSON-document en retourneert een SQL-representatie van die subcomponent.
De ->>
operator werd voor het eerst geïntroduceerd in SQLite versie 3.38.0 (uitgebracht op 22 februari 2022).
Syntaxis
De syntaxis gaat als volgt:
json ->> path
Waar json
is het JSON-document en path
is het pad naar de subcomponent die we eruit willen halen.
We bieden dus een JSON-document aan de linkerkant van de operator, en we specificeren het pad dat we rechts ervan willen extraheren.
De ->>
operator retourneert altijd een SQL-representatie van de opgegeven subcomponent. Gebruik de ->
. om een JSON-representatie te retourneren operator in plaats daarvan.
Voorbeelden
Hier is een eenvoudig voorbeeld om te demonstreren hoe de ->>
operator werkt:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';
Resultaat:
{"name":"Wag","type":"Dog"}
In dit geval heb ik een pad gespecificeerd van '$'
die het hele document retourneert.
Laten we een ander pad specificeren:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
Resultaat:
Dog
We kunnen het dollarteken en de punt ook helemaal weglaten, zoals dit:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';
Resultaat:
Dog
Hier is het met een groter JSON-document:
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]';
Resultaat:
{"user":"Spike","age":30,"scores":[9,7,3]}
In SQLite zijn arrays gebaseerd op nul en specificeren ze dus [0]
geeft het eerste array-element terug.
Als we alleen de scores van die gebruiker wilden hebben, zouden we dit kunnen doen:
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';
Resultaat:
[9,7,3]
We kunnen nog dieper gaan en een specifieke score extraheren:
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]';
Resultaat:
7
Niet-bestaand pad
Als het pad niet bestaat in de JSON, wordt een null-waarde geretourneerd:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';
Resultaat:
null
Merk op dat u in SQLite .nullvalue
. kunt gebruiken om een tekenreeks op te geven die moet worden uitgevoerd wanneer een null-waarde wordt geretourneerd. In mijn geval had ik eerder het volgende commando uitgevoerd:
.nullvalue null
Dat specificeert dat de tekst null
moet worden uitgevoerd wanneer een null-waarde wordt geretourneerd. Daarom geeft het bovenstaande voorbeeld de tekst null
. weer . Als ik dit niet had gedaan, was het resultaat mogelijk leeg geweest.
Ongeldige JSON
Als het eerste argument geen geldige JSON is, wordt er een fout gegenereerd:
SELECT '{ "name" }' ->> '$';
Resultaat:
Runtime error: malformed JSON
Ongeldig pad
En als het tweede argument geen geldig pad is, wordt er een fout gegenereerd:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';
Resultaat:
Runtime error: JSON path error near 'name'
In dit geval ben ik vergeten de punt toe te voegen (.
) tussen het dollarteken ($
) en name
.
Zoals vermeld, is het echter mogelijk om het dollarteken en de punt helemaal weg te laten:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';
Resultaat:
Wag