Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

JSON_VALUE() Примери в SQL Server (T-SQL)

Когато използвате 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на идентификатора на вмъкнат запис:Php &MS SQL SERVER

  2. T-SQL изрязване на   (и други небуквени и цифрови знаци)

  3. Как да върна множество набори от резултати със SqlCommand?

  4. Съпоставяне на композитни ключове, като се използва първо EF код

  5. Използвайте OBJECT_NAME(), за да получите името на обект от неговия object_id в SQL Server