sql - 使用 FOR JSON 时获取值数组而不是对象数组

标签 sql json sql-server tsql 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

生成的 JSON 是:
{
    "existing": [
        {
            "id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
        },
        {
            "id": "052455b6-6bf5-47d3-8bee-7ba98d7fbd50"
        }
    ],
    "missing": [
        {
            "id": "328add2d-e8f2-4a0e-af54-5b1733310170"
        }
    ]
}

我想要的是:
{
    "existing": [
        {
            "id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
        },
        {
            "id": "052455b6-6bf5-47d3-8bee-7ba98d7fbd50"
        }
    ],
    "missing": [
        "328add2d-e8f2-4a0e-af54-5b1733310170"            
    ]
}

缺失的数组不应该包含 json 对象,只包含值。
有什么建议?

最佳答案

如果您使用的是 SQL Server 2017,您可以使用 JSON_QUERY 构建您的阵列和 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

结果:
{
  "existing": [
    {
      "id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
    },
    {
      "id": "052455b6-6bf5-47d3-8bee-7ba98d7fbd50"
    }
  ],
  "missing": [
    "328add2d-e8f2-4a0e-af54-5b1733310170"
  ]
}

关于sql - 使用 FOR JSON 时获取值数组而不是对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52532907/

相关文章:

sql - 如何像sql语句一样转义postgres中的字符串?

MySQL:跨2个表的唯一信息

sql - 如何选择 varbinary 类型的记录?

mysql - 为我的模式中的所有表自动生成 DML 存储过程的工具 -MySQL

sql - 尝试在 Ubuntu 19.04 上安装 Oracle Database 19c

json - Node.js JSON.parse 中的curl传输关闭问题

c# - JsonConvert序列化返回 "{}"

c# - 从谷歌 API 获取不准确的谷歌搜索结果

c# - 如何将数据从 ASP.Net 插入到 MS SQL Server?

SQL查询多行列中字符串的串联