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 数组的实际差异。
我正在使用 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 数组的实际差异。