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

Come restituire chiavi duplicate da un documento JSON in SQL Server

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