2017-07-07 69 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

相关问题