Когато използвате JSON със SQL Server, можете да използвате JSON_VALUE()
функция за връщане на скаларна стойност от JSON низ.
За да използвате тази функция, предоставяте два аргумента; JSON израза и свойството за извличане.
Синтаксис
Синтаксисът е така:
JSON_VALUE ( expression , path )
Където expression
е низовият израз на JSON и path
е свойството, което искате да извлечете от този израз.
Аргументът на пътя може да включва незадължителен режим на пътя съставна част. Този незадължителен режим на пътя може да бъде стойност на lax
или strict
. Тази стойност, ако има такава, идва преди знака за долар.
Пример 1 – Основна употреба
Ето пример за демонстриране на основното използване на JSON_VALUE()
функция.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Резултат:
+----------+ | Result | |----------| | Bruce | +----------+
В този пример:
-
{"Name": "Bruce"}
аргументът е JSON изразът (малък, но все пак валиден JSON израз). JSON изразите се състоят от двойка ключ/стойност. В този случайName
е ключът,Bruce
е неговата стойност. -
$.Name
аргументът е пътят. Този път препраща към стойността наName
ключ на JSON израза. Така че можем да извлечем стойността, като се позоваваме на името на двойката.
Пример 2 – Масиви
За да извлечете стойност от масив, посочете неговия индекс в квадратни скоби, последван от съответния ключ. Ето един пример:
/* 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';
Резултат:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Така че в този пример създаваме JSON масив и го поставяме в променлива, наречена @data
. След това изпълняваме заявка, използвайки @data
като първи аргумент на JSON_VALUE()
функция (това е така, защото @data
съдържа JSON израза).
Масивите използват номериране на базата на нула, така че за да извлечем първия елемент, трябва да използваме Cities[0]
, вторият Cities[1]
, и така нататък.
Пример 3 – Пример за база данни
Ако трябваше да поставим данните от предишния пример в база данни, бихме могли да пренапишем заявката, както следва:
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
Резултат:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
Това предполага, че JSON документът се съхранява в колона, наречена Document
, който е в таблица, наречена Json_Documents
.
Пример 4 – Режим на пътя
Както споменахме, вие също имате възможност да посочите режима на пътя. Това може да бъде или lax
или strict
.
Стойността на режима на пътя определя какво се случва, когато изразът за път съдържа грешка. По-конкретно:
- В слабо режим, функцията връща празни стойности, ако изразът за път съдържа грешка. Например, ако поискате стойността $.name , а JSON текстът не съдържа име ключ, функцията връща null, но не предизвиква грешка.
-
В строго режим, функцията повдига грешка, ако изразът за пътя съдържа грешка.
Стойността по подразбиране е lax
.
Ето пример за демонстриране на разликата между тези два режима.
Грешка в слаб режим
Ето какво се случва, когато изразът за път съдържа грешка, докато е в слаб режим.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Резултат:
+----------+ | Result | |----------| | NULL | +----------+
В този пример се опитваме да посочим Hobbies
, но този ключ не съществува в документа JSON. В този случай получаваме нулева стойност (защото използваме слаб режим).
Грешка в строг режим
Ето какво се случва, когато изпълним същия код в строг режим.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Резултат:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Както се очакваше, строг режим води до показване на съобщение за грешка.
Пример 5 – Връщане на обекти и масиви
JSON_VALUE()
функцията не връща обекти и масиви. Ако искате да върнете обект или масив, използвайте JSON_QUERY()
функция вместо това. Ето пример, в който използвам и двете функции в рамките на заявка.
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';
Резултат:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
В този случай използвам JSON_VALUE()
за връщане на различни скаларни стойности и JSON_QUERY()
за да върнете масив.
Така че, ако трябва да върнете обект или масив (включително целия JSON документ), вижте JSON_QUERY()
Примери в SQL Server.