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

Как да върнете дублирани ключове от JSON документ в SQL Server

Ако се опитвате да извлечете стойности от JSON документ, но една или повече от стойностите на същото ниво имат дублиращи се ключове, може да срещнете проблеми, ако се опитате да извлечете тези стойности с помощта на JSON_QUERY() или JSON_VALUE() .

И двете функции ще върнат само първата стойност, която съответства на пътя.

За щастие има и друга опция.

OPENJSON() функцията ще върне всички стойности от всички дублирани ключове на същото ниво.

Пример

Ето пример за демонстрация на OPENJSON() връщане на дублирани свойства на същото ниво.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT * FROM OPENJSON(@json, '$.dog.details'); 

Резултат:

<пред>+-------+---------+-------+| ключ   | стойност    | тип   ||-------+----------+--------|| име  | Извличане    | 1      || име  | Добро куче | 1      || секс   | мъж     | 1      |+-------+---------+-------+

Този пример връща всички дъщерни елементи на $.dog.details ключ.

В този случай имаме два ключа с едно и също име на едно и също ниво (name ключ).

Ако искаме да върнем само стойностите от двете name ключове, можем да направим нещо като следното.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name'; 

Резултат:

+---------+| стойност    ||----------|| Извличане    || Добро куче |+----------+

JSON_VALUE() &JSON_QUERY()

Както споменахме, и двете JSON_VALUE() и JSON_QUERY() връща само първата стойност, която съответства на пътя.

Така че, ако се опитаме да ги използваме срещу горния JSON документ, получаваме следните резултати.

JSON_VALUE()

JSON_VALUE() връща скаларна стойност от JSON низ, така че ще върне следния резултат.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE]; 

Резултат:

+--------------+| JSON_VALUE   ||--------------|| Извличане        |+--------------+

JSON_QUERY()

JSON_QUERY() извлича обект или масив от JSON низ, така че ще върне следния резултат.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY]; 

Резултат:

+--------------+| JSON_QUERY   ||--------------|| {                "name" :"Извличане",                 "name" :"Добро куче",                "sex" :"male"                       -------        | 

Поне с JSON_QUERY() виждаме дублиращите се ключове, но не получаваме индивидуалните им стойности, както получаваме с OPENJSON() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 празен низ срещу пространство

  2. Как да използвам GROUP BY за конкатенация на низове в SQL Server?

  3. Използвайте COL_LENGTH(), за да получите дължината на колона в SQL Server

  4. Регистър на транзакциите на SQL Server — част 2

  5. DATEPART() Примери в SQL Server