2017-08-22 71 views
0

我使用的是SQL Server 2016,目前涉及存储,检索和解析JSON数据。我的问题是列表比较。Json列表比较 - SQL Server 2016

示例数据:表具有2列

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

查询:

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

输出:

["Sport", "Water polo"] 

如果我需要检查[“水球”,“运动”]? SQL Server 2016中的JSON库是否允许检查数组内容,而不考虑数据的顺序?

TIA

+0

请问能详细说明一下如果我需要检查[“Water polo”,“Sport”]' – TheGameiswar

+0

'我认为这是您要查找的内容:[Query in to JSON Arrays in SQL 2016年](https://stackoverflow.com/questions/44051567/json-functions-in-sql-server-2016/44051859#44051859) – user7593937

回答

1

因此,基本上,你需要在你的JSON结构中的tags数组进行比较。如果标签顺序不相关,则可以将tags数组转换为表结果集并使用标准的where value in (select... SQL子句。

的第一件事就是到标签转换为SQL结果集:

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

..then你需要它比较反对任何你。例如。测试我使用的是本地的目的宣布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') 

(注意改变顺序的["Water polo", "Sport"]

..和测试,如果它是不包含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 
) 

如果结果集是空的 - 你的数组是相同的,它们匹配(不管它们的顺序如何)。如果结果集包含任何数据 - 它表示这两个JSON数组的实际差异。