SQL Server为匹配的行返回ID的JSON数组

问题描述 投票:0回答:1

我希望能够从SQL Server返回一个JSON数组作为JSON对象的一部分。

我试图让它工作并且已经接近但这不是我希望JSON被构造的方式。

这个SQL我输出了这个

SELECT c.Pk_Company_Id AS [id],
       c.Name AS [name],
       r.Pk_Rig_Id AS [rigId]
FROM Company c
LEFT JOIN Rig r
ON c.Pk_Company_Id = r.Fk_Company_Id
FOR JSON PATH, ROOT('companies')

{"companies":[{"id":1,"name":"Company 1","rigId":100},{"id":1,"name":"Company 1","rigId":101},{"id":2,"name":"Company 2"}]}

这产生了JSON,它具有我想要的一切,但我想将rigId结构化为JSON数组来生成这样的东西,所以我不会无缘无故地复制一个对象。

{"companies":[{"id":1,"name":"Company 1","rigIds":[100, 101]},{"id":2,"name":"Company 2"}]}
json sql-server
1个回答
1
投票

REPLACE的变种:

SELECT
  c.Pk_Company_Id AS [id],
  c.Name AS [name],
  JSON_QUERY(REPLACE(REPLACE((SELECT r.Pk_Rig_Id id FROM Rig r WHERE c.Pk_Company_Id = r.Fk_Company_Id FOR JSON PATH),'{"id":',''),'}','')) [rigIds]
FROM Company c
FOR JSON PATH, ROOT('companies')

-- {"companies":[{"id":1,"name":"Company 1","rigIds":[100,101]},{"id":2,"name":"Company 2"}]}

STRING_AGG的变种:

SELECT
  c.Pk_Company_Id AS [id],
  c.Name AS [name],
  JSON_QUERY((SELECT '['+STRING_AGG(r.Pk_Rig_Id,',')+']' FROM Rig r WHERE c.Pk_Company_Id = r.Fk_Company_Id)) [rigIds]
FROM Company c
FOR JSON PATH, ROOT('companies')
© www.soinside.com 2019 - 2024. All rights reserved.