När du använder JSON med SQL Server kan du använda JSON_VALUE()
funktion för att returnera ett skalärt värde från en JSON-sträng.
För att använda den här funktionen anger du två argument; JSON-uttrycket och egenskapen som ska extraheras.
Syntax
Syntaxen ser ut så här:
JSON_VALUE ( expression , path )
Där uttryck
är JSON-stränguttrycket och sökväg
är egenskapen du vill extrahera från uttrycket.
Sökvägsargumentet kan inkludera ett valfritt sökvägsläge komponent. Detta valfria sökvägsläge kan vara ett värde av antingen lax
eller strict
. Detta värde, om något, kommer före dollartecknet.
Exempel 1 – Grundläggande användning
Här är ett exempel för att visa grundläggande användning av JSON_VALUE()
funktion.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Resultat:
+----------+ | Result | |----------| | Bruce | +----------+
I det här exemplet:
{"Namn":"Bruce"} argument är JSON-uttrycket (ett litet, men fortfarande ett giltigt JSON-uttryck). JSON-uttryck består av ett nyckel/värdepar. I det här fallet Namn
är nyckeln,Bruce
är dess värde.$.Name
argument är vägen. Den här sökvägen refererar till värdet förName
nyckeln för JSON-uttrycket. Så vi kan extrahera värdet genom att referera till namnet på paret.
Exempel 2 – Arrayer
För att extrahera ett värde från en matris, referera till dess index inom hakparenteser, följt av relevant nyckel. Här är ett exempel:
/* 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';
Resultat:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Så i det här exemplet skapar vi en JSON-array och lägger den i en variabel som heter @data
. Vi kör sedan en fråga med @data
som det första argumentet för JSON_VALUE()
funktion (detta beror på att @data
innehåller JSON-uttrycket).
Arrayer använder nollbaserad numrering, så för att extrahera det första objektet måste vi använda Cities[0]
, den andra Städer[1]
, och så vidare.
Exempel 3 – Ett databasexempel
Om vi skulle lägga in data från föregående exempel i en databas skulle vi kunna skriva om frågan enligt följande:
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
Resultat:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Detta förutsätter att JSON-dokumentet lagras i en kolumn som heter Document
, som finns i en tabell som heter Json_Documents
.
Exempel 4 – Path Mode
Som nämnts har du också möjlighet att ange sökvägsläge. Detta kan antingen vara slappt
eller strict
.
Värdet för sökvägsläget avgör vad som händer när sökvägsuttrycket innehåller ett fel. Närmare bestämt:
- I slappa läget returnerar funktionen tomma värden om sökvägsuttrycket innehåller ett fel. Om du till exempel begär värdet $.name , och JSON-texten innehåller inget namn nyckel returnerar funktionen null, men ger inget fel.
-
I strikt läget ger funktionen ett fel om sökvägsuttrycket innehåller ett fel.
Standardvärdet är lax
.
Här är ett exempel för att visa skillnaden mellan dessa två lägen.
Fel i slappt läge
Här är vad som händer när sökvägsuttrycket innehåller ett fel i slappt läge.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Resultat:
+----------+ | Result | |----------| | NULL | +----------+
I det här exemplet försöker vi referera till hobbyer
, men den nyckeln finns inte i JSON-dokumentet. I det här fallet får vi ett nollvärde (eftersom vi använder slappt läge).
Fel i strikt läge
Det här är vad som händer när vi kör samma kod i strikt läge.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Resultat:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Som förväntat resulterar strikt läge i att ett felmeddelande visas.
Exempel 5 – Returnerande objekt och matriser
JSON_VALUE()
funktion returnerar inte objekt och arrayer. Om du vill returnera ett objekt eller en array, använd JSON_QUERY()
funktion istället. Här är ett exempel där jag använder båda funktionerna i en fråga.
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';
Resultat:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
I det här fallet använder jag JSON_VALUE()
för att returnera olika skalära värden och JSON_QUERY()
för att returnera en array.
Så om du behöver returnera ett objekt eller en array (inklusive hela JSON-dokumentet), se JSON_QUERY()
Exempel i SQL Server.