首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用存储过程创建用于JSON路径的嵌套JSON数组

使用存储过程创建用于JSON路径的嵌套JSON数组
EN

Stack Overflow用户
提问于 2022-06-24 12:56:22
回答 1查看 276关注 0票数 1

我有一个如下所示的表,需要将JSON格式的数据返回到。

在下面添加表脚本。

代码语言:javascript
运行
复制
CREATE TABLE [dbo].[TempStudentJsonData]
(
    [StudentID] [int] NULL,
    [subject] [varchar](500) NULL,
    [result] [varchar](10) NULL
) 
GO

以下是测试数据。

代码语言:javascript
运行
复制
INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result]) 
VALUES (506995, N'PHYSICS', N'Pass')
GO

INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result]) 
VALUES (506995, N'CHEMISTRY', N'Fail')
GO

INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result]) 
VALUES (506996, N'PHYSICS', N'Pass')
GO

INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result]) 
VALUES (506996, N'BIOLOGY', N'Pass' )
GO

INSERT INTO [dbo].[TempStudentJsonData] ([StudentID], [subject], [result]) 
VALUES (506997, N'MATH', N'Pass')
GO

从这个表中,我想生成一个JSON,如下所示

代码语言:javascript
运行
复制
[
        {
            "506995": [
                {
                    "subject": "Physics",
                    "result": "Pass"
                },
                 {
                    "subject": "Chemistry",
                    "result": "Fail"
                }
            ]
        },
        {
            "506996" : [
                {
                    "subject": "Physics",
                    "reason": "Pass"
                },
                {
                    "subject": "Biology",
                    "reason": "Pass"
                }
            ]
        },
        {
            "506997" : [
                {
                    "subject": "Math",
                    "reason": "Pass"
                }
            ]
        }
]

我们如何才能做到这一点?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-24 14:30:19

不幸的是,Server不支持动态键,也不支持JSON_AGG (创建一个裸JSON数组)。因此,您需要使用STRING_AGG自己构建一些

代码语言:javascript
运行
复制
SELECT '[' + STRING_AGG(sjd.json, ',') + ']'
FROM (
    SELECT
      json =
      CONCAT(
        '{"',
        sjd.StudentID,
        '":[',
        STRING_AGG(j.json, ','),
        ']}'
      )
    FROM TempStudentJsonData sjd
    CROSS APPLY (
        SELECT
          sjd.subject,
          sjd.result
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    ) j(json)
    GROUP BY
      sjd.StudentID
) sjd;

请注意,此版本相对于相关的自联接的好处是只扫描表一次。

输出:

代码语言:javascript
运行
复制
[
  {
    "506995": [
      {
        "subject": "PHYSICS",
        "result": "Pass"
      },
      {
        "subject": "CHEMISTRY",
        "result": "Fail"
      }
    ]
  },
  {
    "506996": [
      {
        "subject": "PHYSICS",
        "result": "Pass"
      },
      {
        "subject": "BIOLOGY",
        "result": "Pass"
      }
    ]
  },
  {
    "506997": [
      {
        "subject": "MATH",
        "result": "Pass"
      }
    ]
  }
]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72744431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档