Json 列表比较 - SQL Server 2016

Json list comparison - SQL Server 2016

我正在使用 SQL Server 2016,目前参与存储、检索和解析 JSON 数据。我的问题是列表比较。

示例数据: Table 有 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"]

如果我需要检查 ["Water polo","Sport"],我该如何匹配? JSON SQL Server 2016 中的库是否允许检查数组内容而不考虑数据顺序?

TIA

所以基本上,您需要在 JSON 结构中比较 tags 的数组。如果标签的顺序无关紧要,您可以将 tags 数组转换为 table 结果集并使用标准 where value in (select... SQL 子句。

首先是将标签转换成SQL结果集:

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

..那么你需要将它与你拥有的任何东西进行比较。例如。出于测试目的,我使用本地声明的 JSON string:

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"] 的顺序改变了)

..并测试它是否 not 包含在 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 数组的实际差异。