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 delName
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.