在以下记录集(代表产品属性)上使用FOR JSON AUTO
或FOR JSON PATH
:
attribute | value
-----------------
color | red
size | small
将产生:
[{"attribute":"color","value":"red"},{"attribute":"size","value":"small"}]
有没有办法生成以下内容:
{"color":"red","size":"small"}
注意,因为每个产品属性都与其他属性不同;因此,每个产品的记录集都不同。 PIVOTing不是一个选项,因为它需要动态的SQL!似乎我们需要一个函数能够CROSS
使用products表来生成例如产品目录。
答案 0 :(得分:7)
我使用string concatenation function string_agg in SQL Server 2017代替SQL Server 2016的JSON函数,如下面的脚本
所示/*create table ProductAttributes (
product int,
attribute varchar(40),
value varchar(40)
)
insert into ProductAttributes select 1, 'color', 'red'
insert into ProductAttributes select 1, 'size', 'small'
insert into ProductAttributes select 2, 'processor', 'intel'
insert into ProductAttributes select 2, 'ram', '16'
insert into ProductAttributes select 2, 'weight', '2'*/
select
product, '{' + STRING_AGG( '"' + attribute + '":"' + STRING_ESCAPE(value,'json') + '"' ,',') + '}' as attributes
from ProductAttributes
group by product
两个产品条目的输出如下 产品属性 1 {“color”:“red”,“size”:“small”} 2 {“processor”:“intel”,“ram”:“16”,“weight”:“2”}
如果您使用的是以前的版本而不是SQL Server 2017,则可以使用string concatenation using SQL XML Path,如下所示
SELECT
product,
'{' + STUFF(
(
SELECT
',' + '"' + attribute + '":"' + STRING_ESCAPE(value,'json') + '"'
FROM ProductAttributes a
where a.product = p.product
FOR XML PATH(''),TYPE
).value('.','VARCHAR(MAX)'
), 1, 1, ''
) + '}' As attributes
from ProductAttributes p
group by product
开发人员将得到相同的结果
我已经更新了上面的SQL查询并使用了String_Escape()函数@Eilert的评论