I SQLite er ->>
operatør udtrækker en underkomponent fra et JSON-dokument og returnerer en SQL-repræsentation af den underkomponent.
Syntaks
Syntaksen ser sådan ud:
json ->> path
Hvor json
er JSON-dokumentet og sti
er stien til underkomponenten, som vi ønsker at udtrække fra den.
Så vi leverer et JSON-dokument til venstre for operatøren, og vi angiver stien, vi ønsker at udtrække, til højre for det.
->
operatør i stedet.
Eksempler
Her er et simpelt eksempel til at demonstrere, hvordan ->>
operatør virker:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';
Resultat:
{"name":"Wag","type":"Dog"}
I dette tilfælde har jeg angivet en sti til '$'
som returnerer hele dokumentet.
Lad os specificere en anden sti:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
Resultat:
Dog
Vi kan også helt udelade dollartegnet og punktum, sådan her:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';
Resultat:
Dog
Her er det med et 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 er arrays nul-baserede, og specificerer derfor [0]
returnerer det første array-element.
Hvis vi kun ville have den brugers score, kunne vi gøre dette:
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å endnu dybere og udtrække en bestemt score:
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
Ikke-eksisterende sti
Hvis stien ikke findes i JSON, returneres en null-værdi:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';
Resultat:
null
Bemærk, at I SQLite kan du bruge .nullvalue
for at angive en streng, der skal udlæses, når en nulværdi returneres. I mit tilfælde havde jeg tidligere kørt følgende kommando:
.nullvalue null
Det angiver, at teksten null
skal udlæses, hver gang en nulværdi returneres. Det er grunden til, at ovenstående eksempel udskriver teksten null
. Hvis jeg ikke havde gjort dette, kunne resultatet have været tomt.
Ugyldig JSON
Hvis det første argument ikke er gyldigt JSON, vises en fejl:
SELECT '{ "name" }' ->> '$';
Resultat:
Runtime error: malformed JSON
Ugyldig sti
Og hvis det andet argument ikke er en gyldig sti, vises en fejl:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';
Resultat:
Runtime error: JSON path error near 'name'
I dette tilfælde glemte jeg at inkludere punktum (.
) mellem dollartegnet ($
) og navn
.
Men som nævnt er det muligt helt at udelade dollartegnet og punktum:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';
Resultat:
Wag