SQL Server:选择在json列中具有特定id的行

时间:2017-07-07 08:19:06

标签: sql-server json tsql

我有一个包含两列的表:[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)

1 个答案:

答案 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