Fra og med SQLite version 3.38.0 (frigivet den 22. februar 2022) kan vi nu bruge -> og ->> operatører til at udtrække underkomponenter af JSON-dokumenter.
Målet med disse operatører er at være kompatible med de tilsvarende MySQL- og PostgreSQL-operatører.
Fra og med SQLite 3.38.0 er JSON-funktionerne nu indbyggede. Derfor er det ikke længere nødvendigt at bruge -DSQLITE_ENABLE_JSON1 mulighed for kompileringstid for at aktivere JSON-understøttelse.
Syntaks
Måden disse operatører fungerer på er sådan her:
json -> path
json ->> path
Hvor json er JSON-dokumentet og sti er den vej, vi ønsker at udvinde 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.
Forskellen mellem disse operatører ser sådan ud:
-> operatør returnerer altid en JSON-repræsentation af den angivne underkomponent->> operator returnerer altid en SQL-repræsentation af den angivne underkomponent
Eksempel på -> Operatør
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å gøre det sådan her:
SELECT '{ "name" : "Wag", "type" : "Dog" }' -> 'type'; Resultat:
"Dog"
Eksempel på ->> Operatør
Her er, hvad der sker, når vi bruger ->> i stedet:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type'; Resultat:
Dog
Værdien er ikke angivet, som den var før. Det er fordi -> returnerer en JSON-repræsentation af underkomponenten og ->> returnerer en SQL-repræsentation.
Her er et eksempel med en matrix:
SELECT '{ "scores" : [ 9, 7, 5 ] }' ->> '$.scores[2]'; Resultat:
5
Hvis værdien udelukkende består af et array, kan vi gøre dette:
SELECT '[ 9, 7, 5 ]' ->> '2'; Resultat:
5
Det returnerer array-elementet ved det angivne indeks (i dette tilfælde 2).
Arrays er nul-baserede (optælling starter ved 0 ), og det er derfor 2 returnerer den tredje vare.