2017-08-22 2 views
0

J'utilise SQL Server 2016 et je suis actuellement impliqué dans le stockage, la récupération et l'analyse de données JSON. Ma question porte sur la comparaison des listes.Comparaison de liste Json - SQL Server 2016

données de l'échantillon: table comporte 2 colonnes

Column1 - Data = 'Microsoft' 
Column2 - Data = '{"info":{"type":1,"address": {"town":"Bristol","county":"Avon","country":"England"},"tags":["Sport", "Water polo"]},"type":"Basic"}' 

Query:

SELECT JSON_QUERY(Column2, '$.info.tags') from dbo.sample_table; 

sortie:

["Sport", "Water polo"] 

Comment puis-je faire correspondre si j'ai besoin de vérifier ["Water-polo", "Sport"]? La bibliothèque JSON dans SQL Server 2016 permet-elle de vérifier le contenu d'un tableau quel que soit l'ordre des données?

TIA

+0

Pouvez-vous donner plus de détails sur ce 'Comment puis-je correspondre si je dois vérifier [" Water-polo "," Sport "]' – TheGameiswar

+0

Je pense que c'est ce que vous cherchez: [Requête dans JSON Arrays dans SQL 2016] (https://stackoverflow.com/questions/44051567/json-functions-in-sql-server-2016/44051859#44051859) – user7593937

Répondre

1

Donc, fondamentalement, vous avez besoin de comparer le tableau de tags au sein de votre structure JSON. Si l'ordre des tags n'est pas pertinent, vous pouvez convertir votre tableau tags en un ensemble de résultats de table et utiliser la clause SQL standard where value in (select....

La première chose est de convertir les balises en jeu SQL résultat:

SELECT TagsData.[value] 
FROM sample_table T CROSS APPLY OPENJSON (T.Column2, '$.info.tags') AS TagsData 

..then vous devez comparer contre tout ce que vous avez. Par exemple. pour tester des fins que je utilise déclaré localement chaîne JSON:

DECLARE @json NVARCHAR(4000) = N' 
    { 
     "info":{"type":1,"address": {"town":"Bristol","county":"Avon","country":"England"}, 
     "tags":["Water polo", "Sport"]},"type":"Basic" 
    }'; 

SELECT [value] 
FROM OPENJSON(@json,'$.info.tags') 

(notez l'ordre a changé de ["Water polo", "Sport"])

..et teste si elle est pas contenu dans le Column2:

DECLARE @json NVARCHAR(4000) = N' 
    { 
     "info":{"type":1,"address": {"town":"Bristol","county":"Avon","country":"England"}, 
     "tags":["Water polo", "Sport"]},"type":"Basic" 
    }'; 

SELECT [value] 
FROM OPENJSON(@json,'$.info.tags') 
where [value] not in 
(
SELECT TagsData.[value] 
FROM TestTable T CROSS APPLY OPENJSON (T.Column2, '$.info.tags') AS TagsData 
) 

Si le jeu de résultats est vide - vos tableaux sont identiques et correspondent (indépendamment de leur ordre). Si le jeu de résultats contient des données, cela représente une différence réelle entre ces deux tableaux JSON.