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