Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

JSON_VALUE() Esempi in SQL Server (T-SQL)

Quando si utilizza JSON con SQL Server, è possibile utilizzare JSON_VALUE() funzione per restituire un valore scalare da una stringa JSON.

Per utilizzare questa funzione, fornisci due argomenti; l'espressione JSON e la proprietà da estrarre.

Sintassi

La sintassi è questa:

JSON_VALUE ( expression , path )

Dove expression è l'espressione della stringa JSON e path è la proprietà che vuoi estrarre da quell'espressione.

L'argomento percorso può includere una modalità percorso opzionale componente. Questa modalità di percorso opzionale può essere un valore di lax o strict . Questo valore, se presente, precede il simbolo del dollaro.

Esempio 1 – Utilizzo di base

Ecco un esempio per dimostrare l'utilizzo di base di JSON_VALUE() funzione.

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

Risultato:

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

In questo esempio:

  • Il {"Name": "Bruce"} argomento è l'espressione JSON (piccola, ma comunque un'espressione JSON valida). Le espressioni JSON sono costituite da una coppia chiave/valore. In questo caso, Name è la chiave, Bruce è il suo valore.
  • Il $.Name l'argomento è il percorso. Questo percorso fa riferimento al valore del Name chiave dell'espressione JSON. Quindi possiamo estrarre il valore facendo riferimento al nome della coppia.

Esempio 2 – Matrici

Per estrarre un valore da una matrice, fare riferimento al suo indice tra parentesi quadre, seguito dalla chiave pertinente. Ecco un esempio:

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

Risultato:

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

Quindi, in questo esempio, creiamo un array JSON e lo inseriamo in una variabile chiamata @data . Quindi eseguiamo una query, utilizzando @data come primo argomento di JSON_VALUE() funzione (questo è perché @data contiene l'espressione JSON).

Gli array usano la numerazione in base zero, quindi per estrarre il primo elemento dobbiamo usare Cities[0] , il secondo Cities[1] , e così via.

Esempio 3:un esempio di database

Se dovessimo inserire i dati dell'esempio precedente in un database, potremmo riscrivere la query come segue:

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

Risultato:

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

Ciò presuppone che il documento JSON sia archiviato in una colonna denominata Document , che si trova in una tabella chiamata Json_Documents .

Esempio 4 – Modalità percorso

Come accennato, hai anche la possibilità di specificare la modalità del percorso. Può essere lax o strict .

Il valore della modalità percorso determina cosa succede quando l'espressione percorso contiene un errore. Nello specifico:

  • In lassista modalità, la funzione restituisce valori vuoti se l'espressione del percorso contiene un errore. Ad esempio, se richiedi il valore $.name e il testo JSON non contiene un nome chiave, la funzione restituisce null, ma non genera un errore.
  • In rigoroso modalità, la funzione genera un errore se l'espressione del percorso contiene un errore.

Il valore predefinito è lax .

Ecco un esempio per dimostrare la differenza tra queste due modalità.

Errore in modalità lassista

Ecco cosa succede quando l'espressione del percorso contiene un errore in modalità lassista.

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

Risultato:

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

In questo esempio stiamo cercando di fare riferimento a Hobbies , ma quella chiave non esiste nel documento JSON. In questo caso otteniamo un valore nullo (perché stiamo usando la modalità lax).

Errore in modalità rigorosa

Ecco cosa succede quando eseguiamo lo stesso codice in modalità rigorosa.

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

Risultato:

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

Come previsto, la modalità rigorosa comporta la visualizzazione di un messaggio di errore.

Esempio 5 – Restituzione di oggetti e array

Il JSON_VALUE() la funzione non restituisce oggetti e array. Se vuoi restituire un oggetto o un array, usa JSON_QUERY() funzione invece. Ecco un esempio in cui utilizzo entrambe le funzioni all'interno di una query.

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

Risultato:

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

In questo caso, utilizzo JSON_VALUE() per restituire vari valori scalari e JSON_QUERY() per restituire un array.

Quindi, se devi restituire un oggetto o un array (incluso l'intero documento JSON), vedi JSON_QUERY() Esempi in SQL Server.