sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo devolver claves duplicadas de un documento JSON en SQL Server

Si está tratando de extraer valores de un documento JSON, pero uno o más de los valores en el mismo nivel tienen claves duplicadas, es posible que tenga problemas si intenta extraer esos valores usando JSON_QUERY() o JSON_VALUE() .

Ambas funciones solo devolverán el primer valor que coincida con la ruta.

Afortunadamente, hay otra opción.

El OPENJSON() la función devolverá todos los valores de cualquier clave duplicada en el mismo nivel.

Ejemplo

Aquí hay un ejemplo para demostrar OPENJSON() devolviendo propiedades duplicadas en el mismo nivel.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT * FROM OPENJSON(@json, '$.dog.details');

Resultado:

+-------+----------+--------+
| key   | value    | type   |
|-------+----------+--------|
| name  | Fetch    | 1      |
| name  | Good Dog | 1      |
| sex   | male     | 1      |
+-------+----------+--------+

Este ejemplo devuelve todos los elementos secundarios de $.dog.details clave.

En este caso, tenemos dos llaves con el mismo nombre en el mismo nivel (el name clave).

Si quisiéramos devolver solo los valores de los dos name llaves, podríamos hacer algo como lo siguiente.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT value FROM OPENJSON(@json, '$.dog.details')
WHERE [key] = 'name';

Resultado:

+----------+
| value    |
|----------|
| Fetch    |
| Good Dog |
+----------+

JSON_VALUE() &JSON_QUERY()

Como se mencionó, ambos JSON_VALUE() y JSON_QUERY() solo devuelva el primer valor que coincida con la ruta.

Entonces, si tratamos de usarlos contra el documento JSON anterior, obtenemos los siguientes resultados.

JSON_VALUE()

JSON_VALUE() devuelve un valor escalar de una cadena JSON, por lo que devolverá el siguiente resultado.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_VALUE(@json, '$.dog.details.name') AS [JSON_VALUE];

Resultado:

+--------------+
| JSON_VALUE   |
|--------------|
| Fetch        |
+--------------+

JSON_QUERY()

JSON_QUERY() extrae un objeto o una matriz de una cadena JSON, por lo que devolverá el siguiente resultado.

DECLARE @json NVARCHAR(4000) = N'{
    "dog" : {
            "details" : {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }
        }
    }';
SELECT JSON_QUERY(@json, '$.dog.details') AS [JSON_QUERY];

Resultado:

+--------------+
| JSON_QUERY   |
|--------------|
| {
                "name" : "Fetch", 
                "name" : "Good Dog",
                "sex" : "male"
            }              |
+--------------+

Al menos con JSON_QUERY() podemos ver las claves duplicadas, pero no obtenemos sus valores individuales como obtenemos con OPENJSON() .