Se stai cercando di estrarre valori da un documento JSON, ma uno o più valori allo stesso livello hanno chiavi duplicate, potresti riscontrare problemi se tenti di estrarre quei valori usando JSON_QUERY()
o JSON_VALUE()
.
Entrambe queste funzioni restituiranno solo il primo valore che corrisponde al percorso.
Fortunatamente, c'è un'altra opzione.
Il OPENJSON()
la funzione restituirà tutti i valori da qualsiasi chiave duplicata sullo stesso livello.
Esempio
Ecco un esempio per dimostrare OPENJSON()
restituendo proprietà duplicate allo stesso livello.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT * FROM OPENJSON(@json, '$.dog.details');
Risultato:
+-------+----------+--------+ | key | value | type | |-------+----------+--------| | name | Fetch | 1 | | name | Good Dog | 1 | | sex | male | 1 | +-------+----------+--------+
Questo esempio restituisce tutti i figli di $.dog.details
chiave.
In questo caso, abbiamo due chiavi con lo stesso nome sullo stesso livello (il name
chiave).
Se volessimo restituire solo i valori dei due name
chiavi, potremmo fare qualcosa del genere.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name';
Risultato:
+----------+ | value | |----------| | Fetch | | Good Dog | +----------+
JSON_VALUE()
&JSON_QUERY()
Come accennato, entrambi JSON_VALUE()
e JSON_QUERY()
restituisce solo il primo valore che corrisponde al percorso.
Quindi, se proviamo a usarli contro il documento JSON sopra, otteniamo i seguenti risultati.
JSON_VALUE()
JSON_VALUE()
restituisce un valore scalare da una stringa JSON, quindi restituirà il seguente risultato.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE];
Risultato:
+--------------+ | JSON_VALUE | |--------------| | Fetch | +--------------+
JSON_QUERY()
JSON_QUERY()
estrae un oggetto o un array da una stringa JSON, quindi restituirà il seguente risultato.
DECLARE @json NVARCHAR(4000) = N'{
"dog" : {
"details" : {
"name" : "Fetch",
"name" : "Good Dog",
"sex" : "male"
}
}
}';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY];
Risultato:
+--------------+ | JSON_QUERY | |--------------| | { "name" : "Fetch", "name" : "Good Dog", "sex" : "male" } | +--------------+
Almeno con JSON_QUERY()
possiamo vedere le chiavi duplicate, ma non otteniamo i loro valori individuali come otteniamo con OPENJSON()
.