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() .