In SQLite, de json_extract()
functie extraheert en retourneert een of meer waarden uit goed gevormde JSON.
We geven de JSON door als een argument wanneer we de functie aanroepen, en het retourneert de toepasselijke waarde/s.
We kunnen een of meer paden specificeren om uit het JSON-document te extraheren.
Syntaxis
De syntaxis gaat als volgt:
json_extract(X,P1,P2,...)
Waar X
staat voor het JSON-document, en P1,P2,...
zijn paden die we kunnen gebruiken om specifieke delen van het JSON-document te extraheren.
Voorbeelden
Hier is een eenvoudig voorbeeld om te demonstreren:
SELECT json_extract('{ "a" : 1 }', '$');
Resultaat:
{"a":1}
Hier heb ik een pad gespecificeerd van $
, die het hele JSON-document retourneert.
Hier is een voorbeeld met een groter JSON-document:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$'
);
Resultaat:
{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}
Laten we het pad veranderen zodat we alleen de dogs
. teruggeven reeks:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs'
);
Resultaat:
[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]
Laten we een van de elementen in de array selecteren:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Resultaat:
{"name":"Bark","scores":[3,4,8,7]}
Arrays zijn gebaseerd op nul, en dus begint de telling bij 0
. Daarom hebben we [1]
. gespecificeerd om het tweede element binnen de dogs
te krijgen array, wat toevallig een JSON-object is.
Laten we weer dieper gaan en alleen de naam van de hond op die positie in de array retourneren:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].name'
);
Resultaat:
Bark
Specificeer meerdere paden
De json_extract()
functie stelt ons in staat om meerdere paden te selecteren:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);
Resultaat:
["Wag","Bark","Woof"]
In dit geval heb ik de namen geretourneerd van alle honden in de dogs
array.
Alle hondennamen worden geretourneerd in een array.
Een niet-bestaand pad selecteren
Als we verwijzen naar een pad dat niet bestaat, null
wordt geretourneerd.
Laten we eerst .nullvalue
. instellen naar NULL
:
.nullvalue NULL
De .nullvalue
dot-opdracht stelt ons in staat om een tekenreeks op te geven die zal worden gebruikt om null-waarden te vervangen. Het is een van de vele manieren waarop u null-waarden kunt vervangen door een tekenreeks in SQLite. In dit geval heb ik het ingesteld op NULL
. Nu, alle null-waarden retourneren NULL
in plaats van een leeg resultaat.
Laten we nu json_extract()
. aanroepen , maar gebruik een tweede argument dat verwijst naar een niet-bestaand pad:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.cats'
);
Resultaat:
NULL
Ongeldige paden
We krijgen een foutmelding als ons pad niet goed is gevormd:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'dogs'
);
Resultaat:
Runtime error: JSON path error near 'dogs'
In dit geval ben ik vergeten $.
aan de voorkant van het pad.
Ongeldige JSON-documenten
We krijgen ook een foutmelding dat de JSON niet goed is gevormd:
SELECT json_extract('{ "Dogs" : }',
'$'
);
Resultaat:
Runtime error: malformed JSON
Deze keer vertelt de fout ons dat onze JSON een verkeerde indeling heeft.
Retourtypes
In de SQLite-documentatie staat het volgende:
Als er slechts één pad P1 is opgegeven, is het SQL-gegevenstype van het resultaat NULL voor een JSON null, INTEGER of REAL voor een JSON-numerieke waarde, een INTEGER nul voor een JSON false-waarde, een INTEGER één voor een JSON true-waarde, de tekst tussen aanhalingstekens voor een JSON-tekenreekswaarde en een tekstrepresentatie voor JSON-object- en matrixwaarden. Als er meerdere padargumenten zijn (P1, P2, enzovoort), retourneert deze routine SQLite-tekst, een goed gevormde JSON-array die de verschillende waarden bevat.
MySQL-compatibiliteit
De SQLite-documentatie waarschuwt ons ook voor een subtiele incompatibiliteit tussen de SQLite- en MySQL-implementaties van de json_extract()
functie.
Er staat specifiek:
De MySQL-versie van json_extract() retourneert altijd JSON. De SQLite-versie van json_extract() retourneert alleen JSON als er twee of meer PATH-argumenten zijn (omdat het resultaat dan een JSON-array is) of als het enkele PATH-argument verwijst naar een array of object. Als json_extract() in SQLite slechts één PATH-argument heeft en dat PATH verwijst naar een JSON-null of een tekenreeks of een numerieke waarde, dan retourneert json_extract() de bijbehorende SQL-waarde NULL, TEXT, INTEGER of REAL.
In principe wordt dit verschil pas duidelijk bij toegang tot individuele waarden binnen de JSON die strings of NULL's zijn.