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,Nameis de sleutel,Bruceis de waarde ervan. - De
$.Nameargument is het pad. Dit pad verwijst naar de waarde van deNamesleutel 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.