将两列转换为键值 json 对象?
Convert two columns into key-value json object?
在以下记录集(代表产品属性)上使用 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
它与产品 table 生成例如 产品目录 .
我使用 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 的评论
在以下记录集(代表产品属性)上使用 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
它与产品 table 生成例如 产品目录 .
我使用 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 的评论