Wanneer u JSON met SQL Server gebruikt, kunt u de JSON_VALUE()
functie om een scalaire waarde van een JSON-tekenreeks te retourneren.
Om deze functie te gebruiken, geeft u twee argumenten op; de JSON-expressie en de eigenschap die moet worden geëxtraheerd.
Syntaxis
De syntaxis gaat als volgt:
JSON_VALUE ( expression , path )
Waar expression
is de JSON-tekenreeksexpressie en path
is de eigenschap die u uit die uitdrukking wilt halen.
Het padargument kan een optionele padmodus bevatten onderdeel. Deze optionele padmodus kan een waarde zijn van lax
of strict
. Deze waarde, indien aanwezig, komt vóór het dollarteken.
Voorbeeld 1 – Basisgebruik
Hier is een voorbeeld om het basisgebruik van de JSON_VALUE()
te demonstreren functie.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Resultaat:
+----------+ | Result | |----------| | Bruce | +----------+
In dit voorbeeld:
- De
{"Name": "Bruce"}
argument is de JSON-expressie (een kleine, maar nog steeds een geldige JSON-expressie). JSON-expressies bestaan uit een sleutel/waarde-paar. In dit geval,Name
is de sleutel,Bruce
is de waarde ervan. - De
$.Name
argument is het pad. Dit pad verwijst naar de waarde van deName
sleutel van de JSON-expressie. Dus we kunnen de waarde extraheren door te verwijzen naar de naam van het paar.
Voorbeeld 2 – Arrays
Om een waarde uit een array te extraheren, verwijst u naar de index tussen vierkante haken, gevolgd door de relevante sleutel. Hier is een voorbeeld:
/* CREATE THE ARRAY (and put into a variable called @data) */ DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' /* QUERY THE ARRAY */ SELECT JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[0].District') AS 'District', JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population' UNION ALL SELECT JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name', JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(@data,'$.Cities[1].District') AS 'District', JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
Resultaat:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Dus in dit voorbeeld maken we een JSON-array en plaatsen deze in een variabele met de naam @data
. Vervolgens voeren we een query uit met behulp van @data
als het eerste argument van de JSON_VALUE()
functie (dit komt omdat @data
bevat de JSON-expressie).
Arrays gebruiken op nul gebaseerde nummering, dus om het eerste item te extraheren, moeten we Cities[0]
gebruiken , de tweede Cities[1]
, enzovoort.
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_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
Resultaat:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
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 – 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_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Resultaat:
+----------+ | Result | |----------| | NULL | +----------+
In dit voorbeeld proberen we te verwijzen naar Hobbies
, maar die sleutel bestaat niet in het JSON-document. 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_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Resultaat:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Zoals verwacht resulteert de strikte modus in een foutmelding die wordt weergegeven.
Voorbeeld 5 – Objecten en arrays retourneren
De JSON_VALUE()
functie retourneert geen objecten en arrays. Als u een object of een array wilt retourneren, gebruikt u de JSON_QUERY()
in plaats daarvan functioneren. Hier is een voorbeeld waarbij ik beide functies binnen een query gebruik.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Address": { "City": "Mae Sai", "Province": "Chiang Rai", "Country": "Thailand" }, "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Resultaat:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
In dit geval gebruik ik JSON_VALUE()
om verschillende scalaire waarden te retourneren, en JSON_QUERY()
om een array terug te geven.
Dus als je een object of een array moet retourneren (inclusief het hele JSON-document), zie JSON_QUERY()
Voorbeelden in SQL Server.