2017-08-22 2 views
0

Ich verwende SQL Server 2016 und bin derzeit am Speichern, Abrufen und Analysieren von JSON-Daten beteiligt. Meine Frage ist auf Listenvergleich.Json-Listenvergleich - SQL Server 2016

Beispieldaten: Tabelle hat zwei Spalten

Column1 - Data = 'Microsoft' 
Column2 - Data = '{"info":{"type":1,"address": {"town":"Bristol","county":"Avon","country":"England"},"tags":["Sport", "Water polo"]},"type":"Basic"}' 

Abfrage:

SELECT JSON_QUERY(Column2, '$.info.tags') from dbo.sample_table; 

Ausgang:

["Sport", "Water polo"] 

Wie finde ich eine Übereinstimmung, wenn ich nach ["Wasserball", "Sport"] suchen muss? Erlaubt die JSON-Bibliothek in SQL Server 2016 das Überprüfen des Array-Inhalts unabhängig von der Reihenfolge der Daten?

TIA

+0

können Sie bitte näher auf diese 'Wie finde ich, wenn ich nach [" Wasserball "," Sport "]' – TheGameiswar

+0

Ich denke, das ist, was Sie suchen: [Abfrage in JSON Arrays in SQL 2016] (https://stackoverflow.com/questions/44051567/json-functions-in-sql-server-2016/44051859#44051859) – user7593937

Antwort

1

Also im Grunde, müssen Sie das Array von tags innerhalb Ihrer JSON-Struktur zu vergleichen. Wenn die Reihenfolge der Tags irrelevant ist, können Sie Ihr Array tags in eine Tabellenergebnismenge konvertieren und die Standard-SQL-Klausel where value in (select... verwenden.

Das erste, was ist Tags in SQL-Ergebnismenge zu konvertieren:

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

..then Sie es gegen irgendetwas vergleichen müssen Sie haben. Z.B. für Prüfzwecke lokal deklariert JSON-String Ich verwende:

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') 

(die geänderte Reihenfolge der ["Water polo", "Sport"] bemerken)

..und testen, wenn es nicht im Column2 enthalten:

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 
) 

Wenn die Ergebnismenge leer ist - Ihre Arrays sind gleich und stimmen überein (unabhängig von ihrer Reihenfolge). Wenn die Ergebnismenge Daten enthält, handelt es sich um einen tatsächlichen Unterschied dieser beiden JSON-Arrays.