Fil*_*lip 5 sql t-sql sql-server json for-json
我正在尝试展平由 构造的对象数组FOR JSON
。
我的查询如下所示:
select
(
select id from MyTable
where id in (select value from OPENJSON(@jsonArray))
FOR JSON PATH
) existing,
(
select value id from OPENJSON(@jsonArray)
where value not in (select Id from MyTable)
FOR JSON PATH
) missing
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
Run Code Online (Sandbox Code Playgroud)
生成的 JSON 为:
{
"existing": [
{
"id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
},
{
"id": "052455b6-6bf5-47d3-8bee-7ba98d7fbd50"
}
],
"missing": [
{
"id": "328add2d-e8f2-4a0e-af54-5b1733310170"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想要的是:
{
"existing": [
{
"id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
},
{
"id": "052455b6-6bf5-47d3-8bee-7ba98d7fbd50"
}
],
"missing": [
"328add2d-e8f2-4a0e-af54-5b1733310170"
]
}
Run Code Online (Sandbox Code Playgroud)
缺失的数组不应包含 json 对象,而应包含值。有什么建议么?
JSON_QUERY
如果您使用的是 SQL Server 2017,您可以使用and构建数组STRING_AGG
(对于 SQL Server 2016,您不能使用STRING_AGG
,因此您必须做一些 estra 工作,但以下想法仍然有效):
declare @missing table(id varchar(max))
declare @existing table(id varchar(max))
insert into @missing values ('a00cd8f6-d1c6-4604-b235-59d3cacd5bcc')
insert into @missing values ('052455b6-6bf5-47d3-8bee-7ba98d7fbd50')
insert into @existing values ('328add2d-e8f2-4a0e-af54-5b1733310170')
select
(
select id from @missing
FOR JSON PATH
) existing,
(
select JSON_QUERY(concat('[' , STRING_AGG(concat('"' , STRING_ESCAPE(id, 'json') , '"'),',') , ']'))
from @existing
) missing
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
Run Code Online (Sandbox Code Playgroud)
结果:
{
"existing": [
{
"id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
},
{
"id": "052455b6-6bf5-47d3-8bee-7ba98d7fbd50"
}
],
"missing": [
"328add2d-e8f2-4a0e-af54-5b1733310170"
]
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4423 次 |
最近记录: |