【问题标题】:Json list comparison - SQL Server 2016Json 列表比较 - SQL Server 2016
【发布时间】:2017-08-22 15:15:58
【问题描述】:

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

示例数据:表格有 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"],我该如何匹配? SQL Server 2016 中的 JSON 库是否允许检查数组内容而不考虑数据顺序?

TIA

【问题讨论】:

标签: sql arrays sql-server json sql-server-2016


【解决方案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

..那么你需要将它与你拥有的任何东西进行比较。例如。出于测试目的,我使用本地声明的 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 数组的实际差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多