Jeśli próbujesz wyodrębnić wartości z dokumentu JSON, ale jedna lub więcej wartości na tym samym poziomie ma zduplikowane klucze, możesz napotkać problemy, jeśli spróbujesz wyodrębnić te wartości za pomocą JSON_QUERY() lub JSON_VALUE() .
Obie te funkcje zwrócą tylko pierwszą wartość, która pasuje do ścieżki.
Na szczęście jest inna opcja.
OPENJSON() funkcja zwróci wszystkie wartości z dowolnych zduplikowanych kluczy na tym samym poziomie.
Przykład
Oto przykład demonstrujący OPENJSON() zwraca zduplikowane właściwości na tym samym poziomie.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT * FROM OPENJSON(@json, '$.dog.details'); Wynik:
+-------+----------+--------+| klucz | wartość | wpisz ||-------+----------+--------|| nazwa | Pobierz | 1 || nazwa | Dobry Pies | 1 || seks | mężczyzna | 1 |+-------+----------+------------+
Ten przykład zwraca wszystkie dzieci $.dog.details klawisz.
W tym przypadku mamy dwa klucze o tej samej nazwie na tym samym poziomie (name klawisz).
Gdybyśmy chcieli zwrócić tylko wartości z dwóch name klawisze, moglibyśmy zrobić coś takiego.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name'; Wynik:
+----------+| wartość ||----------|| Pobierz || Dobry pies |+----------+
JSON_VALUE() &JSON_QUERY()
Jak wspomniano, zarówno JSON_VALUE() i JSON_QUERY() zwraca tylko pierwszą wartość, która pasuje do ścieżki.
Więc jeśli spróbujemy użyć ich przeciwko powyższemu dokumentowi JSON, otrzymamy następujące wyniki.
JSON_VALUE()
JSON_VALUE() zwraca wartość skalarną z ciągu JSON, więc zwróci następujący wynik.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE]; Wynik:
+--------------+| JSON_VALUE ||--------------|| Pobierz |+--------------+
JSON_QUERY()
JSON_QUERY() wyodrębnia obiekt lub tablicę z ciągu JSON, więc zwróci następujący wynik.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY]; Wynik:
+--------------+| JSON_QUERY ||--------------|| [Przynajmniej z
JSON_QUERY()widzimy zduplikowane klucze, ale nie otrzymujemy ich indywidualnych wartości, jak w przypadkuOPENJSON().