我有一个包含两列的表:[ID]和[Content](带有ISJSON约束,因此每行必须在[Content]列中包含有效的JSON)。 这些JSON有一个数组字段,它由具有某些特定ID(以及更多字段)的对象组成。
where A is not null
我想执行一个选择查询,该查询返回部门字段中对象中具有某些特定ID的所有行。
我设法创建了一个脚本,该脚本使用[Content]列中的游标提取部门字段到@content变量,然后:
{
"departments": [ { "id": 1, "fieldA": "somevalue" },
{ "id": 2, "fieldA": "somevalue" }]
}
但它只返回离开,我需要整行。 最好看起来应该是这样(但不幸的是,下面的代码不起作用):
SELECT * FROM OPENJSON(@content) WITH(id int) WHERE id IN (1, 2, 3, 9)
答案 0 :(得分: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