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.