Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment renvoyer des clés en double à partir d'un document JSON dans SQL Server

Si vous essayez d'extraire des valeurs d'un document JSON, mais qu'une ou plusieurs des valeurs du même niveau ont des clés en double, vous risquez de rencontrer des problèmes si vous essayez d'extraire ces valeurs à l'aide de JSON_QUERY() ou JSON_VALUE() .

Ces deux fonctions ne renverront que la première valeur correspondant au chemin.

Heureusement, il existe une autre option.

Le OPENJSON() renverra toutes les valeurs de toutes les clés en double au même niveau.

Exemple

Voici un exemple pour démontrer OPENJSON() renvoyant les propriétés en double au même niveau.

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

Résultat :

+-------+----------+--------+| clé   | valeur    | tapez   ||-------+----------+--------|| nom | Récupérer    | 1      || nom | Bon chien | 1      || sexe   | mâle     | 1      |+-------+----------+--------+

Cet exemple renvoie tous les enfants de $.dog.details clé.

Dans ce cas, nous avons deux clés avec le même nom au même niveau (le name clé).

Si nous voulions renvoyer uniquement les valeurs des deux name clés, nous pourrions faire quelque chose comme ce qui suit.

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

Résultat :

+----------+| valeur    ||----------|| Récupérer    || Bon chien |+----------+

JSON_VALUE() &JSON_QUERY()

Comme mentionné, les deux JSON_VALUE() et JSON_QUERY() ne renvoie que la première valeur qui correspond au chemin.

Donc, si nous essayons de les utiliser par rapport au document JSON ci-dessus, nous obtenons les résultats suivants.

JSON_VALUE()

JSON_VALUE() renvoie une valeur scalaire à partir d'une chaîne JSON, il renverra donc le résultat suivant.

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

Résultat :

+--------------+| JSON_VALUE   ||--------------|| Récupérer        |+--------------+

JSON_QUERY()

JSON_QUERY() extrait un objet ou un tableau d'une chaîne JSON, il renverra donc le résultat suivant.

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

Résultat :

+--------------+| JSON_QUERY   ||--------------||  

Au moins avec JSON_QUERY() nous arrivons à voir les clés en double, mais nous n'obtenons pas leurs valeurs individuelles comme nous l'obtenons avec OPENJSON() .