从具有多条记录的 SQL 表创建 JSON 数组

Create JSON Array from SQL table with multiple records

提问人:SteveG 提问时间:11/16/2023 最后编辑:SteveG 更新时间:11/18/2023 访问量:51

问:

我有一个名为Accts的SQL表,其数据显示如图所示。我想创建一个 JSON 文件,其中包含客户编号数组。

使用下面的代码,我能够以正确的格式获取它。如何让 Customers 数组中的每个客户都被 Quotes 包围?

select a.[Name], a.[Identifier], JSON_ARRAY("Customer")as Customers
  from 
     (
       select ltrim(rtrim([Name])) as [Name],ltrim(rtrim([Identifier])) as Identifier,  
       string_agg(cast(ltrim(rtrim(custnmbr)) as varchar(max)), ', ') as Customer
       from [dbo].[AcctReps]
   Group by [Identifier], [Name]
    )a

FOR json AUTO, Root('代表')

数组 JSON SQL-Server

评论

4赞 Abra 11/16/2023
为什么我不应该上传代码/数据/错误的图像?
4赞 Abra 11/16/2023
为什么要“标记我的 RDBMS”?
0赞 jarlh 11/16/2023
我无法在我的小笔记本电脑屏幕上阅读那个微小的图像文本。
0赞 Adrian Maxwell 11/16/2023
为您的问题选择最佳标签符合您的利益。“SQL”作为标记没有用处,因为每个 DBMS 供应商都选择以不同的方式实现它,因此存在重要的语法差异。因此,为了快速获得解决方案,请不要使用“sql”作为标记。
0赞 SteveG 11/16/2023
理解。感谢您的清晰度。

答:

0赞 Adrian Maxwell 11/16/2023 #1

请注意,以下假设查询是用 T-SQL 编写的。(理想情况下,应选择标识 dbms 的标记。

FORMATMESSAGE('"%s"', custnmbr)将在每个 custnmbr 周围添加双引号。请参阅 FORMATMESSAGE

CREATE TABLE [dbo].[AcctReps]
(
    [Name] NVARCHAR(50),
    [Identifier] NVARCHAR(50),
    [custnmbr] NVARCHAR(50)
)

INSERT INTO [dbo].[AcctReps] ([Name], [Identifier], [custnmbr])
VALUES 
('John Doe', 'JD1', 'CUST001'),
('John Doe', 'JD1', 'CUST002'),
('Jane Smith', 'JS1', 'CUST003'),
('Jane Smith', 'JS1', 'CUST004'),
('Jane Smith', 'JS1', 'CUST005'),
('Bob Johnson', 'BJ1', 'CUST006')

6 rows affected
select a.[Name], a.[Identifier], JSON_QUERY('[' + a.Customer + ']') as Customers
from 
(
   select ltrim(rtrim([Name])) as [Name], ltrim(rtrim([Identifier])) as Identifier,  
   string_agg(FORMATMESSAGE('"%s"', cast(ltrim(rtrim(custnmbr)) as varchar(max))), ', ') as Customer
   from [dbo].[AcctReps]
   Group by [Identifier], [Name]
) a
FOR JSON PATH, ROOT('Reps')
JSON_F52E2B61-18A1-11D1-B105-00805F49916B
{“Reps”:[{“Name”:“Bob Johnson”,“Identifier”:“BJ1”,“Customers”:[“CUST006”]},{“Name”:“Jane Smith”,“Identifier”:“JS1”,“Customers”:[“CUST003”, “CUST004”, “CUST005”]},{“Name”:“John Doe”,“Identifier”:“JD1”,“Customers”:[“CUST001”, “CUST002”]}]}

小提琴

请注意,最好以可重用的格式(非图像)提供您自己的示例数据。

{
  "Reps": [
    {
      "Name": "Bob Johnson",
      "Identifier": "BJ1",
      "Customers": [
        "CUST006"
      ]
    },
    {
      "Name": "Jane Smith",
      "Identifier": "JS1",
      "Customers": [
        "CUST003",
        "CUST004",
        "CUST005"
      ]
    },
    {
      "Name": "John Doe",
      "Identifier": "JD1",
      "Customers": [
        "CUST001",
        "CUST002"
      ]
    }
  ]
}

评论

0赞 SteveG 11/16/2023
非常感谢您的帮助。代码有效,输出正是我想要的。很抱歉没有添加实际数据。我试过了,但格式不正确,所以我改用粘贴图像。再次感谢。
0赞 Adrian Maxwell 11/17/2023
要使文本以固定宽度的字体显示,只需缩进 4 个空格即可。工具栏中也有一个图标。搜索网站帮助以获取有关格式的更多信息。还有一些免费网站可以将文本转换为固定宽度的表格。避免图像的方法有很多。请不要将它们用于数据。
0赞 Adrian Maxwell 11/17/2023
将来,请使用数据库类型标记您的问题(我仍然可以假设是 sql server)。