Ако се опитвате да извлечете стойности от 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()
.