2017-07-07 1 views
1

Ich habe eine Tabelle mit zwei Spalten: [ID] und [Content] (mit ISJSON-Einschränkung, so dass jede Zeile gültige JSON in Spalte [Content] haben muss). Diese JSONs haben ein Array-Feld, das aus Objekten mit einer bestimmten ID (und vielen weiteren Feldern) besteht.SQL Server: Wählen Sie Zeilen mit bestimmten ID in ihrer JSON-Spalte

{ 
    "departments": [ { "id": 1, "fieldA": "somevalue" }, 
        { "id": 2, "fieldA": "somevalue" }] 
    } 

Ich möchte eine Auswahlabfrage auszuführen, die in dem Objekt aus Abteilungen Feld alle Zeilen mit einem bestimmten ID zurückgibt.

ich es geschafft, ein Skript zu erstellen, die einen Cursor Abteilungen Feld von [Inhalt] Spalte in @content Variable verwendet und dann holen:

SELECT * FROM OPENJSON(@content) WITH(id int) WHERE id IN (1, 2, 3, 9) 

Aber es gibt nur DepartmentID und ich brauche die ganze Reihe. Vorzugsweise sollte es so aussehen (aber Code unten leider nicht funktioniert):

SELECT * FROM ITEM I WHERE EXISTS 
(SELECT * FROM OPENJSON(I.CONTENT) WITH(id int) WHERE id IN (1, 2, 3, 9)) 

Antwort

0

Wenn ich Sie richtig verstanden, das man bekommen konnte, was Sie brauchen:

declare @someId varchar(10) = '1' 
declare @json nvarchar(1000) = N'{ "departments": [ { "id": 1, "fieldA": "somevalue" }, { "id": 1, "fieldA": "test" }, { "id": 2, "fieldA": "somevalue" }] }' 

select ids.[key], ids.[value] id_val, depts.value content 
from openjson(@json, '$.departments') as depts cross apply OPENJSON(depts.value) as ids 
where ids.[key] = 'id' and ids.value = @someId 

ich ein weiteres Element hinzugefügt haben an das departments Array, mit dem gleichen Id = 1 nur zum Testen der Ergebnisse.

EDIT:

select ids.[key], ids.[value] id_val, depts.value content 
from ITEMS i cross apply openjson(i.Content, '$.departments') as depts cross apply OPENJSON(depts.value) as ids 
where ids.[key] = 'id' and ids.value = @id 
+0

Das sieht vielversprechend aus, danke! Jetzt habe ich eine Tabelle, die viele Zeilen mit JSON-Daten enthält. Wie kann ich Ihr Snippet verwenden, um dieses Problem zu lösen? Ich bin gewohnt, Funktionen aus Sprachen wie R Vektorisierte Funktionen und ich war enttäuscht, als ich sah: 'declare @id nvarchar (2) = '17' wählen Sie IDs. [Schlüssel], IDs. [Wert] id_val , depts.value Inhalt von openjson ((SELECT INHALT VON ITEM), '$ .departments') als depts cross anwenden OPENJSON (depts.value) als IDs wo IDS. [Key] = 'AbteilungID' und IDS.WERT = @ id' gibt 'Unterabfrage zurück mehr als 1 Wert' Fehler :( – duke

+0

Hm, ja, weil Ihre Auswahl alle' Content' Werte aus Ihrer 'ITEM' Tabelle erhält. Sie müssen diese nacheinander für jeden anwenden Spalte "Inhalt" Ich denke an Kreuz mit Ihrer Quellentabelle _OR_ erstellen eine dynamische Abfrage .. Ich werde Versuche das erste Szenario. –

+0

Wenn ich eine Annahme machen könnte, dass nur eine Zeile in meiner Tabelle json mit dieser ID in json hat, würde ich SELECT TOP 1 verwenden. Leider ist diese Annahme falsch. – duke

Verwandte Themen