sql >> Databáze >  >> RDS >> Sqlserver

Příklady JSON_QUERY() v SQL Server (T-SQL)

Při použití JSON se serverem SQL Server můžete použít JSON_QUERY() funkce pro extrahování objektu nebo pole z řetězce JSON.

Chcete-li tuto funkci použít, zadejte jako argument výraz JSON. Můžete také zadat druhý (volitelný) argument pro určení objektu nebo pole, které se má extrahovat.

Syntaxe

Syntaxe vypadá takto:

JSON_QUERY ( výraz [ , cesta ] ) 

Kde expression je řetězcový výraz JSON a path je objekt nebo pole, které chcete z tohoto výrazu extrahovat. path argument je volitelný (pokud jej nezadáte, vrátí se celý dokument JSON).

Argument cesty (pokud je zadán) 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 určuje, co se stane v případě, že zadaná cesta je neplatná. Režim cesty (pokud je dodán) je před znakem dolaru.

Příklad 1 – Základní použití

Zde je příklad demonstrující základní použití JSON_QUERY() funkce.

DECLARE @data NVARCHAR(4000)SET @data=N'{ "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Populace" :1780000 }, { "Jméno":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[0 ]') AS 'Výsledek';

Výsledek:

+-----------+| Výsledek ||-----------|| { "Jméno":"Kabul", "CountryCode":"AFG", "District":"Kabol", "Populace":1780000 } |+----------+

V tomto příkladu nejprve deklaruji a nastavím proměnnou s názvem @data . Této proměnné pak přiřadím pole. Jakmile to udělám, spustím dotaz na toto pole.

V tomto případě používám Cities[0] odkazovat na první položku v poli (pole JSON používají číslování založené na nule).

K druhé položce jsem mohl přistupovat pomocí Cities[1] . Takhle:

DECLARE @data NVARCHAR(4000)SET @data=N'{ "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Populace" :1780000 }, { "Jméno":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Populace":237500 } ]}'SELECT JSON_QUERY(@data, '$.Cities[1 ]') AS 'Výsledek';

Výsledek:

+-----------+| Výsledek ||-----------|| { "Jméno":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } |+----------+

Příklad 2 – Vrácení celého výrazu JSON

Druhý argument je volitelný, takže pokud jej vynecháte, vrátí se celý dokument JSON. Co se stane, když to uděláme pomocí stejných dat z předchozích příkladů:

DECLARE @data NVARCHAR(4000)SET @data=N'{ "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Populace" :1780000 }, { "Název":"Qandahar", "CountryCode":"AFG", "District":"Qandahar", "Population":237500 } ]}'SELECT JSON_QUERY(@data) AS 'Result'; 

Výsledek:

+-----------+| Výsledek ||-----------|| { "Města":[ { "Název":"Kábul", "CountryCode":"AFG", "District":"Kabol", "Population":1780000 }, { "Name":"Qandahar", "CountryCode" :"AFG", "District":"Qandahar", "Populace":237500 } ]} |+----------+

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_QUERY(Document,'$.Cities[0]') AS 'City 1'FROM Json_Documents

Výsledek:

+-----------+| Město 1 ||-----------|| { "ID":1, "Jméno":"Kábul", "CountryCode":"AFG", "Okres":"Kabol", "Populace":1780000 } |+-----------+ 

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 – Skalární hodnoty

JSON_QUERY() funkce není navržena tak, aby vracela skalární hodnoty. Pokud chcete vrátit skalární hodnotu, použijte JSON_VALUE() místo toho.

Nic vám však nebrání zkombinovat obě funkce v rámci dotazu a vrátit data na různých úrovních podrobnosti.

Zde je příklad:

DECLARE @data NVARCHAR(4000)SET @data=N'{ "Podezřelý":{ "Jméno":"Homer Simpson", "Hobby":["Jídlo", "Spánek", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies [2]') JAKO 'Poslední koníček';

Výsledek:

+---------------+------------------------------ ----------+--------------+| Jméno | Koníčky | Poslední koníček ||---------------+------------------------------ ----------+--------------|| Homer Simpson | ["Jíst", "Spát", "Base Jumping"] | Base Jumping |+---------------+------------------------------ ----------+--------------+

V tomto příkladu jsem použil JSON_VALUE() k extrakci různých skalárních hodnot, ale také jsem použil JSON_QUERY() vrátit celé pole (což JSON_VALUE() nemůžu).

Příklad 5 – 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ě:

  • 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.
  • 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_QUERY('{"Name":"Bruce"}', 'laxní $.Name') AS 'Result';

Výsledek:

+-----------+| Výsledek ||-----------|| NULL |+----------+

V tomto příkladu se snažíme vrátit skalární hodnotu, ale JSON_QUERY() nedělá skalární hodnoty. Jak bylo zmíněno, vrací pouze objekty a pole. 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_QUERY('{"Name":"Bruce"}', 'strict $.Name') AS 'Result';

Výsledek:

Zpráva 13624, úroveň 16, stav 2, řádek 1 V zadané cestě JSON nelze nalézt objekt nebo pole.

Jak se očekávalo, přísný režim má za následek chybovou zprávu vysvětlující chybu.


  1. 4 způsoby, jak najít řádky, které obsahují malá písmena v Oracle

  2. Jak nainstalovat MySQL 8 pomocí Workbench na Windows 10

  3. Aktualizujte prohlášení s vnitřním spojením na Oracle

  4. Příprava serveru MySQL nebo MariaDB pro produkci – část první