2017-07-07 64 views
1

我有一個包含兩列的表:[ID]和[Content](帶有ISJSON約束,因此每行在[Content]列中必須具有有效的JSON)。 這些JSON有一個數組字段,它由具有特定ID(以及更多字段)的對象組成。SQL Server:選擇在其json列中具有特定id的行

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

我想執行一個選擇查詢,這與從部門領域的對象一些特定的ID返回所有行。

我設法創建一個使用遊標取出由[內容]列部門現場爲@content變量,然後腳本:

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

但它只返回DepartmentID的,我需要整行。 優選地,它應該是一個(但下面的代碼遺憾的是不工作):

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

回答

0

如果我理解正確的話,這可能會得到你需要的東西:

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 

我已經加入其他元素到departments陣列,與Id = 1相同,僅用於測試結果。

編輯:

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

這看起來很有希望,非常感謝!現在我有一個包含json數據的許多行的表。我怎麼能用你的代碼片段來解決這個問題?我習慣於從R和R這樣的語言中矢量化函數,當我看到它時我感到很失望: 'declare @id nvarchar(2)= '17' select ids。[key],ids。[value] id_val ((選擇內容從項目),'$ .departments')作爲部門交叉應用OPENJSON(depts.value)作爲ids 其中ids。[key] ='departmentid'和ids.value = @ id' 返回子查詢返回的值超過1個錯誤:( – duke

+0

嗯,是的,因爲您的選擇是從您的ITEM表中獲取所有內容值,您需要逐一應用此值'Content'專欄 我正在考慮與您的源表交叉應用_OR_構建動態查詢..我會給第一個場景一個嘗試。 –

+0

如果我可以假設我的表中只有一行具有帶json中該id的json,那麼我將使用SELECT TOP 1.不幸的是,這種假設是錯誤的。 – duke

相關問題