繁体   English   中英

SQL 服务器使用列值作为列名并转换为 json 数组

[英]SQL Server use column value as column names and convert to json array

假设我有下表 ProductValues:

产品编号 姓名 价值
1 市场 一个
1 顾客
2 市场 C
2 顾客 D

我可以按它们的 ProductID 对它们进行分组,并使用以下代码将这些值作为数组获取:

SELECT
(
    SELECT Name, Value FROM ProductValues
    WHERE P.ID = ProductID
    FOR JSON PATH
)
FROM @ProductIDs P '@ProductIDs is a table containing the productIDs that Id like to retrieve'

这将返回以下内容:

(无列名)
[{“名称”:“市场”,“价值”:“A”},{“名称”:“客户”,“价值”:“B”}]
[{"Name":"Market","Value":"C"},{"Name":"Customer","Value":"D"}]

我想使用 Pivot 动态创建键值对。 我想实现以下目标:

(无列名)
[{"市场":"A"},{"客户":"B"}]
[{"市场":"C"},{"客户":"D"}]

查看另一个答案,我尝试了以下方法,但这不会动态设置键并且不会执行(说明 Pivot 中的“值”和“技术名称”未定义):

SELECT(
    SELECT Market, Customer
    FOR JSON PATH
)
FROM(
    SELECT(
        SELECT Name, Value FROM ProductValues
        WHERE ProductID =  P.ID
    )
    FROM @ProductIDs P
) t
PIVOT(
    MAX(Value)  '<--- "Value" Undefined'
    FOR Name IN ( '<--- "Name" Undefined'
        Market, Customer
    )
) AS pvt
GROUP BY
    Market, Customer

您可以使用条件聚合将 pivot 转换为 JSON:

select (
    select
        max(case when name = 'Market'   then value end) as market,
        max(case when name = 'Customer' then value end) as customer
    from productvalues pv
    where pv.productid = p.productid
    for json path
) as js
from @ProductIDs p

这是关于 DB Fiddle 的演示

SQL 服务器在设计上是声明性的。 如果您正在寻找动态列,您将需要DYNAMIC SQL

例子

Declare @sql nvarchar(max) = stuff( (Select Distinct ','+QUOTENAME(Name) From ProductValues FOR XML PATH('')),1,1,'') 

SET @sql = 'Select B.*
              From (
                    SELECT '+@sql+'
                    FROM  ProductValues 
                    PIVOT (max([Value]) FOR [Name] IN ('+@sql+')) AS pvt
                   ) A
             Cross Apply ( (Select A.* for json path ) ) B (JSONData)'
exec(@sql)

退货

JSONData
[{"Customer":"B","Market":"A"}]
[{"Customer":"D","Market":"C"}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM