Når du bruger JSON med SQL Server, kan du bruge JSON_VALUE()
funktion til at returnere en skalarværdi fra en JSON-streng.
For at bruge denne funktion giver du to argumenter; JSON-udtrykket og egenskaben, der skal udtrækkes.
Syntaks
Syntaksen ser sådan ud:
JSON_VALUE ( expression , path )
Hvor udtryk
er JSON-strengudtrykket og sti
er den egenskab, du vil udtrække fra det udtryk.
Stiargumentet kan inkludere en valgfri stitilstand komponent. Denne valgfri stitilstand kan være en værdi af enten lax
eller strict
. Denne værdi, hvis nogen, kommer før dollartegnet.
Eksempel 1 – Grundlæggende brug
Her er et eksempel til at demonstrere grundlæggende brug af JSON_VALUE()
funktion.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Resultat:
+----------+ | Result | |----------| | Bruce | +----------+
I dette eksempel:
{"Navn":"Bruce"} argument er JSON-udtrykket (et lille, men stadig et gyldigt JSON-udtryk). JSON-udtryk består af et nøgle/værdi-par. I dette tilfælde Navn
er nøglen,Bruce
er dens værdi.$.Name
argument er vejen. Denne sti refererer til værdien af Name
nøglen til JSON-udtrykket. Så vi kan udtrække værdien ved at henvise til navnet på parret.
Eksempel 2 – Arrays
For at udtrække en værdi fra et array skal du henvise til dets indeks inden for firkantede parenteser efterfulgt af den relevante nøgle. Her er et eksempel:
/* 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 dette eksempel opretter vi et JSON-array og sætter det i en variabel kaldet @data
. Vi kører derefter en forespørgsel ved hjælp af @data
som det første argument for JSON_VALUE()
funktion (dette skyldes @data
indeholder JSON-udtrykket).
Arrays bruger nul-baseret nummerering, så for at udtrække det første element skal vi bruge Cities[0]
, den anden Byer[1]
, og så videre.
Eksempel 3 – Et databaseeksempel
Hvis vi skulle lægge data fra det forrige eksempel ind i en database, kunne vi omskrive forespørgslen som følger:
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 | +----------+----------------+------------+--------------+
Dette forudsætter, at JSON-dokumentet er gemt i en kolonne kaldet Document
, som er i en tabel kaldet Json_Documents
.
Eksempel 4 – Stitilstand
Som nævnt har du også mulighed for at angive stitilstanden. Dette kan enten være slappt
eller strict
.
Værdien af stitilstanden bestemmer, hvad der sker, når stiudtrykket indeholder en fejl. Specifikt:
- I slappe tilstand, returnerer funktionen tomme værdier, hvis stiudtrykket indeholder en fejl. For eksempel, hvis du anmoder om værdien $.name , og JSON-teksten indeholder ikke et navn tast, returnerer funktionen null, men rejser ikke en fejl.
-
I streng tilstand, rejser funktionen en fejl, hvis stiudtrykket indeholder en fejl.
Standardværdien er lax
.
Her er et eksempel for at demonstrere forskellen mellem disse to tilstande.
Fejl i slap tilstand
Her er, hvad der sker, når stiudtrykket indeholder en fejl, mens det er i slap tilstand.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Resultat:
+----------+ | Result | |----------| | NULL | +----------+
I dette eksempel forsøger vi at henvise til Hobbyer
, men den nøgle findes ikke i JSON-dokumentet. I dette tilfælde får vi en nulværdi (fordi vi bruger lax mode).
Fejl i streng tilstand
Her er, hvad der sker, når vi kører den samme kode i streng tilstand.
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 forventet resulterer streng tilstand i, at der vises en fejlmeddelelse.
Eksempel 5 – Returnering af objekter og arrays
JSON_VALUE()
funktion returnerer ikke objekter og arrays. Hvis du vil returnere et objekt eller en matrix, skal du bruge JSON_QUERY()
funktion i stedet for. Her er et eksempel, hvor jeg bruger begge funktioner i en forespørgsel.
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 dette tilfælde bruger jeg JSON_VALUE()
for at returnere forskellige skalarværdier og JSON_QUERY()
for at returnere et array.
Så hvis du har brug for at returnere et objekt eller en matrix (inklusive hele JSON-dokumentet), se JSON_QUERY()
Eksempler i SQL Server.