I SQLite, ->> operatorn extraherar en underkomponent från ett JSON-dokument och returnerar en SQL-representation av den underkomponenten.
Syntax
Syntaxen ser ut så här:
json ->> path
Där json är JSON-dokumentet och sökvägen är sökvägen till underkomponenten som vi vill extrahera från den.
Så vi tillhandahåller ett JSON-dokument till vänster om operatören, och vi anger sökvägen vi vill extrahera till höger om den.
-> operatör istället.
Exempel
Här är ett enkelt exempel för att visa hur ->> operatören fungerar:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$'; Resultat:
{"name":"Wag","type":"Dog"}
I det här fallet angav jag sökvägen '$' som returnerar hela dokumentet.
Låt oss ange en annan sökväg:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type'; Resultat:
Dog
Vi kan också utelämna dollartecknet och punkten helt, så här:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type'; Resultat:
Dog
Här är det med ett större JSON-dokument:
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]'; Resultat:
{"user":"Spike","age":30,"scores":[9,7,3]}
I SQLite är arrayer nollbaserade och specificerar därför [0] returnerar det första arrayelementet.
Om vi bara ville få den användarens poäng kunde vi göra så här:
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'; Resultat:
[9,7,3]
Vi kan gå ännu djupare och extrahera en specifik poäng:
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]'; Resultat:
7
Icke-existerande sökväg
Om sökvägen inte finns i JSON returneras ett nullvärde:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age'; Resultat:
null
Observera att i SQLite kan du använda .nullvalue för att ange en sträng som ska matas ut när ett nollvärde returneras. I mitt fall hade jag tidigare kört följande kommando:
.nullvalue null
Det anger att texten null ska matas ut när ett nollvärde returneras. Det är därför exemplet ovan matar ut texten null . Om jag inte hade gjort det här kan resultatet ha varit tomt.
Ogiltig JSON
Om det första argumentet inte är giltigt JSON, visas ett felmeddelande:
SELECT '{ "name" }' ->> '$'; Resultat:
Runtime error: malformed JSON
Ogiltig sökväg
Och om det andra argumentet inte är en giltig sökväg, skapas ett fel:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name'; Resultat:
Runtime error: JSON path error near 'name'
I det här fallet glömde jag att inkludera punkten (. ) mellan dollartecknet ($ ) och namn .
Men som nämnt är det möjligt att utelämna dollartecknet och punkten helt och hållet:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name'; Resultat:
Wag