我有一个应用程序需要提供配置数据作为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"}
任何人都可以提供的帮助。
答案 0 :(得分:3)
您可以进行一些字符串汇总(假设不是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 :(得分:1)
数据透视查询与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;
请注意,如果您的表包含多个ITEMID
组,则每个项目的输出中将有一个JSON记录。