【问题标题】:Output key value pairs as JSON from T-SQL query从 T-SQL 查询中将键值对输出为 JSON
【发布时间】:2020-12-29 17:13:46
【问题描述】:

我有一个应用需要提供配置数据作为 JSON 中的键值对。

我想从表查询中输出键值对的 JSON。

表格可以有不同的命名项目和不同数量的项目。

表格

ITEMID REPORTID NAME VALUE
1 29 caption Profit by Product
2 29 bgColor #FFFFFF
3 29 showBorder 0
4 29 showsum 0

SQL

select .................   FOR JSON PATH

我猜这需要使用 PIVOT?

预期的 JSON

{"caption":"Profit by Product","bgColor":"#FFFFFF","showBorder":"0","showsum":"0"}

感谢任何人都可以提供的帮助。

【问题讨论】:

    标签: json tsql


    【解决方案1】:

    你可以做一些字符串聚合(假设不是 2017 年)

    示例

    Declare @YourTable Table ([ITEMID] varchar(50),[REPORTID] varchar(50),[NAME] varchar(50),[VALUE] varchar(50))  Insert Into @YourTable Values 
     (1,29,'caption','Profit by Product')
    ,(2,29,'bgColor','#FFFFFF')
    ,(3,29,'showBorder','0')
    ,(4,29,'showsum','0')
    
    
    Select REPORTID
          ,JSONString =  '{' + Stuff((Select concat(',','"',Name,'":"',value,'"') From @YourTable Where ReportID=A.ReportID For XML Path ('')),1,1,'')  + '}'
     From @YourTable A
     Group by REPORTID
    

    退货

    REPORTID    JSONString
    29          {"caption":"Profit by Product","bgColor":"#FFFFFF","showBorder":"0","showsum":"0"}
    

    【讨论】:

    • 太好了,我这边 +1。我认为值得一提的是,使用 For XML Path (''),TYPE).value('.','nvarchar(max)'),1,1,'') 可以避免未转义的 XML 实体。
    【解决方案2】:

    pivot 查询和FOR JSON PATH 应该会生成您期望的 JSON 输出:

    SELECT
        MAX(CASE WHEN NAME = 'caption' THEN VALUE END) AS caption,
        MAX(CASE WHEN NAME = 'bgColor' THEN VALUE END) AS bgColor,
        MAX(CASE WHEN NAME = 'showBorder' THEN VALUE END) AS showBorder,
        MAX(CASE WHEN NAME = 'showsum' THEN VALUE END) AS showsum
    FROM yourTable
    GROUP BY
        ITEMID
    FOR JSON PATH;
    

    Demo

    请注意,如果您的表包含多个 ITEMID 组,则每个项目的输出中将有一个 JSON 记录。

    【讨论】:

    • 我应该提到这需要灵活,键值对可以更改/具有不同的数字。
    • 鉴于您实际向我们展示的示例数据,这是我所知道的最佳答案。如果我的答案不适合某个用例,请提供该用例的数据。
    • 我已经改变了问题,抱歉不清楚。
    • 除了使用通用键名(例如key1key2 等)之外,我不知道有什么方法可以满足您的要求。您可以接受吗?
    • 有数百个潜在的键,所以我希望有一些灵活的东西而不是使用刚性的字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2013-03-30
    相关资源
    最近更新 更多