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.