2017-08-22 158 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數組的實際差異。