2017-08-22 14 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

を確認する必要がある場合はどうすれば一致しますか?これはあなたが探しているものだと思います:[SQLのJSON配列へのクエリ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結果セットにタグを変換することです:あなたが持っているものに対してそれを比較する必要が..then

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

。例えば。私はローカルで使用しているテストの目的のためにJSON文字列を宣言:それは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') 

..andテスト(["Water polo", "Sport"]の変更順序に注意してください):

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 
) 

結果セットが空の場合、配列は同じで、一致します(順序に関係なく)。結果セットにデータが含まれている場合は、2つのJSON配列の実際の違いを表します。