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()
.