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

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

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ě Name je klíč, Bruce je jeho hodnota.
  • $.Name argument je cesta. Tato cesta odkazuje na hodnotu Name klíč 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ě:

  • 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_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.


  1. Chci použít příkaz CASE k aktualizaci některých záznamů na serveru SQL 2005

  2. Maximální velikost pro dotaz SQL Server? klauzule IN? Existuje lepší přístup

  3. Je možné vypnout zpracování nabídek v příkazu Postgres COPY s formátem CSV?

  4. Jaký význam má předpona N v příkazech T-SQL a kdy ji mám použít?