sql >> Databasteknik >  >> RDS >> Sqlserver

JSON_VALUE() Exempel i SQL Server (T-SQL)

När du använder JSON med SQL Server kan du använda JSON_VALUE() funktion för att returnera ett skalärt värde från en JSON-sträng.

För att använda den här funktionen anger du två argument; JSON-uttrycket och egenskapen som ska extraheras.

Syntax

Syntaxen ser ut så här:

JSON_VALUE ( expression , path )

Där uttryck är JSON-stränguttrycket och sökväg är egenskapen du vill extrahera från uttrycket.

Sökvägsargumentet kan inkludera ett valfritt sökvägsläge komponent. Detta valfria sökvägsläge kan vara ett värde av antingen lax eller strict . Detta värde, om något, kommer före dollartecknet.

Exempel 1 – Grundläggande användning

Här är ett exempel för att visa grundläggande användning av JSON_VALUE() funktion.

SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';

Resultat:

+----------+
| Result   |
|----------|
| Bruce    |
+----------+

I det här exemplet:

  • {"Namn":"Bruce"} argument är JSON-uttrycket (ett litet, men fortfarande ett giltigt JSON-uttryck). JSON-uttryck består av ett nyckel/värdepar. I det här fallet Namn är nyckeln, Bruce är dess värde.
  • $.Name argument är vägen. Den här sökvägen refererar till värdet för Name nyckeln för JSON-uttrycket. Så vi kan extrahera värdet genom att referera till namnet på paret.

Exempel 2 – Arrayer

För att extrahera ett värde från en matris, referera till dess index inom hakparenteser, följt av relevant nyckel. Här är ett exempel:

/* 
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';  

Resultat:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Så i det här exemplet skapar vi en JSON-array och lägger den i en variabel som heter @data . Vi kör sedan en fråga med @data som det första argumentet för JSON_VALUE() funktion (detta beror på att @data innehåller JSON-uttrycket).

Arrayer använder nollbaserad numrering, så för att extrahera det första objektet måste vi använda Cities[0] , den andra Städer[1] , och så vidare.

Exempel 3 – Ett databasexempel

Om vi ​​skulle lägga in data från föregående exempel i en databas skulle vi kunna skriva om frågan enligt följande:

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

Resultat:

+----------+----------------+------------+--------------+
| Name     | Country Code   | District   | Population   |
|----------+----------------+------------+--------------|
| Kabul    | AFG            | Kabol      | 1780000      |
| Qandahar | AFG            | Qandahar   | 237500       |
+----------+----------------+------------+--------------+

Detta förutsätter att JSON-dokumentet lagras i en kolumn som heter Document , som finns i en tabell som heter Json_Documents .

Exempel 4 – Path Mode

Som nämnts har du också möjlighet att ange sökvägsläge. Detta kan antingen vara slappt eller strict .

Värdet för sökvägsläget avgör vad som händer när sökvägsuttrycket innehåller ett fel. Närmare bestämt:

  • slappa läget returnerar funktionen tomma värden om sökvägsuttrycket innehåller ett fel. Om du till exempel begär värdet $.name , och JSON-texten innehåller inget namn nyckel returnerar funktionen null, men ger inget fel.
  • strikt läget ger funktionen ett fel om sökvägsuttrycket innehåller ett fel.

Standardvärdet är lax .

Här är ett exempel för att visa skillnaden mellan dessa två lägen.

Fel i slappt läge

Här är vad som händer när sökvägsuttrycket innehåller ett fel i slappt läge.

SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';

Resultat:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

I det här exemplet försöker vi referera till hobbyer , men den nyckeln finns inte i JSON-dokumentet. I det här fallet får vi ett nollvärde (eftersom vi använder slappt läge).

Fel i strikt läge

Det här är vad som händer när vi kör samma kod i strikt läge.

SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';

Resultat:

Msg 13608, Level 16, State 1, Line 1
Property cannot be found on the specified JSON path.

Som förväntat resulterar strikt läge i att ett felmeddelande visas.

Exempel 5 – Returnerande objekt och matriser

JSON_VALUE() funktion returnerar inte objekt och arrayer. Om du vill returnera ett objekt eller en array, använd JSON_QUERY() funktion istället. Här är ett exempel där jag använder båda funktionerna i en fråga.

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';

Resultat:

+---------------+-----------+----------------------------------------+--------------+
| Name          | Country   | Hobbies                                | Last Hobby   |
|---------------+-----------+----------------------------------------+--------------|
| Homer Simpson | Thailand  | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping |
+---------------+-----------+----------------------------------------+--------------+

I det här fallet använder jag JSON_VALUE() för att returnera olika skalära värden och JSON_QUERY() för att returnera en array.

Så om du behöver returnera ett objekt eller en array (inklusive hela JSON-dokumentet), se JSON_QUERY() Exempel i SQL Server.


  1. SEC_CASE_SENSTIVE_LOGON i 12c

  2. Cloud Backup-alternativ för MySQL- och MariaDB-databaser

  3. MySQL RAND() Funktion – Generera ett slumptal i MySQL

  4. Vad är @@SERVICENAME i SQL Server?