Pokud se pokoušíte extrahovat hodnoty z dokumentu JSON, ale jedna nebo více hodnot na stejné úrovni má duplicitní klíče, můžete narazit na problémy, pokud se pokusíte tyto hodnoty extrahovat pomocí JSON_QUERY()
nebo JSON_VALUE()
.
Obě tyto funkce vrátí pouze první hodnotu, která odpovídá cestě.
Naštěstí je tu ještě jedna možnost.
OPENJSON()
funkce vrátí všechny hodnoty ze všech duplicitních klíčů na stejné úrovni.
Příklad
Zde je příklad demonstrující OPENJSON()
vrací duplicitní vlastnosti na stejné úrovni.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT * FROM OPENJSON(@json, '$.dog.details');
Výsledek:
+-------+----------+--------+| klíč | hodnota | typ ||-------+----------+--------|| jméno | Načíst | 1 || jméno | Hodný pes | 1 || sex | muž | 1 |+-------+----------+--------+
Tento příklad vrátí všechny potomky $.dog.details
klíč.
V tomto případě máme dva klíče se stejným názvem na stejné úrovni (name
klíč).
Pokud bychom chtěli vrátit pouze hodnoty ze dvou name
klíče, mohli bychom udělat něco takového.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name';
Výsledek:
+-----------+| hodnota ||----------|| Načíst || Hodný pes |+----------+
JSON_VALUE()
&JSON_QUERY()
Jak již bylo zmíněno, obě JSON_VALUE()
a JSON_QUERY()
vrátí pouze první hodnotu, která odpovídá cestě.
Pokud je tedy zkusíme použít proti výše uvedenému dokumentu JSON, dostaneme následující výsledky.
JSON_VALUE()
JSON_VALUE()
vrátí skalární hodnotu z řetězce JSON, takže vrátí následující výsledek.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE];
Výsledek:
+---------------+| JSON_VALUE ||--------------|| Načíst |+---------------+
JSON_QUERY()
JSON_QUERY()
extrahuje objekt nebo pole z řetězce JSON, takže vrátí následující výsledek.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY];
Výsledek:
+---------------+| JSON_QUERY ||--------------|| { "jméno" :"Aport", "jméno" :"Hodný pes", "sex" :"muž" + "jméno" :"Dobrý pes", "sex" :"muž" - - - -Alespoň s
JSON_QUERY()
vidíme duplicitní klíče, ale nezískáme jejich individuální hodnoty jako uOPENJSON()
.