Wanneer u JSON gebruikt met SQL Server, kunt u de JSON_QUERY()
. gebruiken functie om een object of een array uit een JSON-string te extraheren.
Om deze functie te gebruiken, geeft u de JSON-expressie op als argument. U kunt ook een tweede (optioneel) argument opgeven om het object of de array te specificeren die u wilt extraheren.
Syntaxis
De syntaxis gaat als volgt:
JSON_QUERY ( expression [ , path ] )
Waar expression
is de JSON-tekenreeksexpressie en path
is het object of de array die u uit die expressie wilt extraheren. Het path
argument is optioneel (als u het niet opgeeft, wordt het hele JSON-document geretourneerd).
Het padargument (indien opgegeven) kan een optionele padmodus bevatten onderdeel. Deze optionele padmodus kan een waarde zijn van lax
of strict
. Deze waarde bepaalt wat er gebeurt als het opgegeven pad ongeldig is. De padmodus (indien aanwezig) komt voor het dollarteken.
Voorbeeld 1 – Basisgebruik
Hier is een voorbeeld om het basisgebruik van de JSON_QUERY()
te demonstreren functie.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';
Resultaat:
+----------+ | Result | |----------| | { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
In dit voorbeeld declareer en stel ik eerst een variabele in met de naam @data
. Ik wijs vervolgens een array toe aan deze variabele. Zodra ik dit heb gedaan, voer ik een query uit op die array.
In dit geval gebruik ik Cities[0]
om te verwijzen naar het eerste item in de array (JSON-arrays gebruiken op nul gebaseerde nummering).
Ik kon toegang krijgen tot het tweede item met Cities[1]
. Zoals dit:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';
Resultaat:
+----------+ | Result | |----------| | { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } | +----------+
Voorbeeld 2 – Retourneer de hele JSON-expressie
Het tweede argument is optioneel, dus als u het weglaat, wordt het hele JSON-document geretourneerd. Dit is wat er gebeurt als we dat doen met dezelfde gegevens uit de vorige voorbeelden:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data) AS 'Result';
Resultaat:
+----------+ | Result | |----------| | { "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] } | +----------+
Voorbeeld 3 – Een databasevoorbeeld
Als we de gegevens uit het vorige voorbeeld in een database zouden plaatsen, zouden we de query als volgt kunnen herschrijven:
SELECT JSON_QUERY(Document,'$.Cities[0]') AS 'City 1' FROM Json_Documents
Resultaat:
+----------+ | City 1 | |----------| | { "ID": 1, "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
Dit veronderstelt dat het JSON-document is opgeslagen in een kolom met de naam Document
, die zich in een tabel bevindt met de naam Json_Documents
.
Voorbeeld 4 – Scalaire waarden
De JSON_QUERY()
functie is niet ontworpen om scalaire waarden te retourneren. Als u een scalaire waarde wilt retourneren, gebruikt u de JSON_VALUE()
functie in plaats daarvan.
Niets houdt u echter tegen om beide functies binnen een query te combineren om gegevens op verschillende granulariteitsniveaus te retourneren.
Hier is een voorbeeld:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Resultaat:
+---------------+----------------------------------------+--------------+ | Name | Hobbies | Last Hobby | |---------------+----------------------------------------+--------------| | Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+----------------------------------------+--------------+
In dit voorbeeld gebruikte ik JSON_VALUE()
om verschillende scalaire waarden te extraheren, maar ik gebruikte ook JSON_QUERY()
om een hele array terug te geven (die JSON_VALUE()
kan niet).
Voorbeeld 5 – Padmodus
Zoals vermeld, hebt u ook de mogelijkheid om de padmodus op te geven. Dit kan ofwel lax
. zijn of strict
.
De waarde van de padmodus bepaalt wat er gebeurt als de padexpressie een fout bevat. Specifiek:
- In lax modus, retourneert de functie lege waarden als de padexpressie een fout bevat. Als u bijvoorbeeld de waarde $.name . aanvraagt , en de JSON-tekst bevat geen naam key, de functie retourneert null, maar geeft geen fout.
-
In strikt modus genereert de functie een fout als de paduitdrukking een fout bevat.
De standaardwaarde is lax
.
Hier is een voorbeeld om het verschil tussen deze twee modi te demonstreren.
Fout in lakse modus
Dit is wat er gebeurt als de path-expressie een fout bevat in de lax-modus.
SELECT JSON_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';
Resultaat:
+----------+ | Result | |----------| | NULL | +----------+
In dit voorbeeld proberen we een scalaire waarde te retourneren, maar JSON_QUERY()
doet geen scalaire waarden. Zoals vermeld, retourneert het alleen objecten en arrays. In dit geval krijgen we een null-waarde (omdat we de lax-modus gebruiken).
Fout in strikte modus
Dit is wat er gebeurt als we dezelfde code in de strikte modus uitvoeren.
SELECT JSON_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';
Resultaat:
Msg 13624, Level 16, State 2, Line 1 Object or array cannot be found in the specified JSON path.
Zoals verwacht resulteert de strikte modus in een foutmelding waarin de fout wordt uitgelegd.