将两列转换为键值json对象?

时间:2017-09-12 05:02:25

标签: sql-server json user-defined-functions entity-attribute-value

在以下记录集(代表产品属性)上使用FOR JSON AUTOFOR JSON PATH

attribute | value
-----------------
color     | red
size      | small

将产生:

[{"attribute":"color","value":"red"},{"attribute":"size","value":"small"}]

有没有办法生成以下内容:

{"color":"red","size":"small"}

注意,因为每个产品属性都与其他属性不同;因此,每个产品的记录集都不同。 PIVOTing不是一个选项,因为它需要动态的SQL!似乎我们需要一个函数能够CROSS使用products表来生成例如产品目录

1 个答案:

答案 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”}

enter image description here

如果您使用的是以前的版本而不是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

开发人员将得到相同的结果

enter image description here

我已经更新了上面的SQL查询并使用了String_Escape()函数@Eilert的评论