Při použití JSON se serverem SQL Server můžete použít JSON_VALUE() funkce pro vrácení skalární hodnoty z řetězce JSON.
Chcete-li použít tuto funkci, zadejte dva argumenty; výraz JSON a vlastnost k extrahování.
Syntaxe
Syntaxe vypadá takto:
JSON_VALUE ( expression , path )
Kde expression je řetězcový výraz JSON a path je vlastnost, kterou chcete z tohoto výrazu extrahovat.
Argument cesty může obsahovat volitelný režim cesty součástka. Tento volitelný režim cesty může mít hodnotu buď lax nebo strict . Tato hodnota, pokud existuje, je před znakem dolaru.
Příklad 1 – Základní použití
Zde je příklad demonstrující základní použití JSON_VALUE() funkce.
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
Výsledek:
+----------+ | Result | |----------| | Bruce | +----------+
V tomto příkladu:
{"Name": "Bruce"}argument je výraz JSON (malý, ale stále platný výraz JSON). Výrazy JSON se skládají z páru klíč/hodnota. V tomto případěNameje klíč,Bruceje jeho hodnota.$.Nameargument je cesta. Tato cesta odkazuje na hodnotuNameklíč výrazu JSON. Hodnotu tedy můžeme extrahovat odkazem na název dvojice.
Příklad 2 – Pole
Chcete-li extrahovat hodnotu z pole, odkazujte na jeho index v hranatých závorkách a za ním příslušný klíč. Zde je příklad:
/*
CREATE THE ARRAY (and put into a variable called @data)
*/
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Cities": [
{
"Name": "Kabul",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
},
{
"Name": "Qandahar",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
}
]
}'
/*
QUERY THE ARRAY
*/
SELECT
JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[0].District') AS 'District',
JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population'
UNION ALL
SELECT
JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[1].District') AS 'District',
JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
Výsledek:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
V tomto příkladu tedy vytvoříme pole JSON a vložíme ho do proměnné s názvem @data . Poté spustíme dotaz pomocí @data jako první argument JSON_VALUE() funkce (je to proto, že @data obsahuje výraz JSON).
Pole používají číslování založené na nule, takže k extrahování první položky musíme použít Cities[0] , druhý Cities[1] , a tak dále.
Příklad 3 – Příklad databáze
Pokud bychom vložili data z předchozího příkladu do databáze, mohli bychom dotaz přepsat takto:
SELECT JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
Výsledek:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
To předpokládá, že dokument JSON je uložen ve sloupci s názvem Document , která je v tabulce nazvané Json_Documents .
Příklad 4 – Režim cesty
Jak již bylo zmíněno, máte také možnost určit režim cesty. Může to být buď lax nebo strict .
Hodnota režimu cesty určuje, co se stane, když výraz cesty obsahuje chybu. Konkrétně:
- V laxním režimu, funkce vrací prázdné hodnoty, pokud výraz cesty obsahuje chybu. Pokud například požadujete hodnotu $.name a text JSON neobsahuje název funkce vrátí hodnotu null, ale nevyvolá chybu.
-
V přísném režimu, funkce vyvolá chybu, pokud výraz cesty obsahuje chybu.
Výchozí hodnota je lax .
Zde je příklad, který demonstruje rozdíl mezi těmito dvěma režimy.
Chyba v laxním režimu
Zde je návod, co se stane, když výraz cesty obsahuje chybu v laxním režimu.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
Výsledek:
+----------+ | Result | |----------| | NULL | +----------+
V tomto příkladu se snažíme odkázat na Hobbies , ale tento klíč v dokumentu JSON neexistuje. V tomto případě dostaneme hodnotu null (protože používáme laxní režim).
Chyba v přísném režimu
Zde je to, co se stane, když spustíme stejný kód v přísném režimu.
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
Výsledek:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
Podle očekávání vede přísný režim k zobrazení chybové zprávy.
Příklad 5 – Vrácení objektů a polí
JSON_VALUE() funkce nevrací objekty a pole. Pokud chcete vrátit objekt nebo pole, použijte JSON_QUERY() místo toho funkci. Zde je příklad, kdy v dotazu používám obě funkce.
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Mae Sai",
"Province": "Chiang Rai",
"Country": "Thailand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country',
JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Výsledek:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
V tomto případě používám JSON_VALUE() pro vrácení různých skalárních hodnot a JSON_QUERY() vrátit pole.
Pokud tedy potřebujete vrátit objekt nebo pole (včetně celého dokumentu JSON), podívejte se na JSON_QUERY() Příklady v SQL Server.