Quando si utilizza JSON con SQL Server, è possibile utilizzare JSON_QUERY()
funzione per estrarre un oggetto o un array da una stringa JSON.
Per utilizzare questa funzione, fornisci l'espressione JSON come argomento. Puoi anche fornire un secondo argomento (facoltativo) per specificare l'oggetto o l'array da estrarre.
Sintassi
La sintassi è questa:
JSON_QUERY ( expression [ , path ] )
Dove expression
è l'espressione della stringa JSON e path
è l'oggetto o l'array che vuoi estrarre da quell'espressione. Il path
l'argomento è facoltativo (se non lo fornisci, viene restituito l'intero documento JSON).
L'argomento percorso (se fornito) può includere una modalità percorso opzionale componente. Questa modalità di percorso opzionale può essere un valore di lax
o strict
. Questo valore determina cosa succede nel caso in cui il percorso fornito non sia valido. La modalità percorso (se fornita) precede il simbolo del dollaro.
Esempio 1 – Utilizzo di base
Ecco un esempio per dimostrare l'utilizzo di base di JSON_QUERY()
funzione.
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';
Risultato:
+----------+ | Result | |----------| | { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
In questo esempio, prima dichiaro e imposto una variabile chiamata @data
. Assegno quindi un array a questa variabile. Una volta fatto questo, eseguo una query su quell'array.
In questo caso utilizzo Cities[0]
per fare riferimento al primo elemento dell'array (gli array JSON utilizzano la numerazione in base zero).
Ho potuto accedere al secondo elemento utilizzando Cities[1]
. In questo modo:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';
Risultato:
+----------+ | Result | |----------| | { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } | +----------+
Esempio 2:restituisce l'intera espressione JSON
Il secondo argomento è facoltativo, quindi se lo ometti, viene restituito l'intero documento JSON. Ecco cosa succede quando lo facciamo utilizzando gli stessi dati degli esempi precedenti:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] }' SELECT JSON_QUERY(@data) AS 'Result';
Risultato:
+----------+ | Result | |----------| | { "Cities": [ { "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 }, { "Name": "Qandahar", "CountryCode": "AFG", "District": "Qandahar", "Population": 237500 } ] } | +----------+
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_QUERY(Document,'$.Cities[0]') AS 'City 1' FROM Json_Documents
Risultato:
+----------+ | City 1 | |----------| | { "ID": 1, "Name": "Kabul", "CountryCode": "AFG", "District": "Kabol", "Population": 1780000 } | +----------+
Ciò presuppone che il documento JSON sia archiviato in una colonna denominata Document
, che si trova in una tabella chiamata Json_Documents
.
Esempio 4 – Valori scalari
Il JSON_QUERY()
La funzione non è progettata per restituire valori scalari. Se vuoi restituire un valore scalare, usa JSON_VALUE()
funzione invece.
Tuttavia, nulla ti impedisce di combinare entrambe le funzioni all'interno di una query per restituire dati a vari livelli di granularità.
Ecco un esempio:
DECLARE @data NVARCHAR(4000) SET @data=N'{ "Suspect": { "Name": "Homer Simpson", "Hobbies": ["Eating", "Sleeping", "Base Jumping"] } }' SELECT JSON_VALUE(@data,'$.Suspect.Name') AS 'Name', JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies', JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
Risultato:
+---------------+----------------------------------------+--------------+ | Name | Hobbies | Last Hobby | |---------------+----------------------------------------+--------------| | Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+----------------------------------------+--------------+
In questo esempio ho usato JSON_VALUE()
per estrarre vari valori scalari, ma ho anche usato JSON_QUERY()
per restituire un intero array (che JSON_VALUE()
non posso fare).
Esempio 5 – 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_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';
Risultato:
+----------+ | Result | |----------| | NULL | +----------+
In questo esempio stiamo cercando di restituire un valore scalare, ma JSON_QUERY()
non esegue valori scalari. Come accennato, restituisce solo oggetti e array. 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_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';
Risultato:
Msg 13624, Level 16, State 2, Line 1 Object or array cannot be found in the specified JSON path.
Come previsto, la modalità rigorosa genera un messaggio di errore che spiega l'errore.