如何使用FOR JSON PATH将具有键/值对的表查询到JSON对象中?

乍得·吉尔伯特

我有一个Asset表和Attributes表,其中的属性是简单的键/值对。

DECLARE @Asset TABLE(AssetID INT)
INSERT @Asset VALUES (1)

DECLARE @Att TABLE (AssetID INT, Name NVARCHAR(100), Val NVARCHAR(100))
INSERT @Att VALUES (1, 'height', '100px'), (1, 'width', '200px')

我想编写一个按资产分组并包含具有所有属性的JSON表示形式的列的查询。例如:

AssetID      Attributes
------------ -----------------------------------------------
1            {"height":"100px","width":"200px"}

如何编写查询,以便属性名称值成为结果JSON对象中的键?当我使用FOR JSON PATH时,键是列名:

SELECT
    AssetID,
    (
        SELECT Name, Val
        FROM @Att att
        WHERE att.AssetID = asset.AssetID
        FOR JSON PATH
    ) Attributes
FROM @Asset asset

返回...

AssetID      Attributes
------------ -----------------------------------------------
1            [{"Name":"height","Val":"100px"},{"Name":"width","Val":"200px"}]
普雷迪普

不确定是否有任何本机JSON方法可以获取列数据,如Key中所述JSONAlias名称将在中转换为键值JSON

所以这是我的尝试

您需要旋转数据以获取所需的键值对格式 JSON

如果key是静态的,则

SELECT
    AssetID,
    (
        SELECT Max(CASE WHEN NAME = 'height' THEN Val END) AS height,
               Max(CASE WHEN NAME = 'width' THEN Val END) AS width
        FROM @Att att
        WHERE att.AssetID = asset.AssetID
        FOR JSON path, WITHOUT_ARRAY_WRAPPER
    ) Attributes
FROM @Asset asset

WITHOUT_ARRAY_WRAPPER默认情况下删除包围JSONFOR JSON子句输出的方括号

结果:

+---------+--------------------------------------+
| AssetID |              Attributes              |
+---------+--------------------------------------+
|       1 | [{"height":"100px","width":"200px"}] |
+---------+--------------------------------------+

由于密钥可以是任何东西,因此我们需要使用动态查询来透视数据

对于演示,我已将表变量更改为临时表

CREATE TABLE #Asset
  (
     AssetID INT
  )

INSERT #Asset
VALUES (1)

CREATE TABLE #Att
  (
     AssetID INT,
     NAME    NVARCHAR(100),
     Val     NVARCHAR(100)
  )

INSERT #Att
VALUES (1,'height','100px'),
       (1,'width','200px')

DECLARE @col VARCHAR(8000)= ''

SET @col = (SELECT ',Max(CASE WHEN NAME = ''' + NAME
                   + ''' THEN Val END) as ' + Quotename(NAME)
            FROM   #Att
            FOR xml path(''))
SET @col = Stuff(@col, 1, 1, '')

EXEC ('
SELECT
    AssetID,
    (
        SELECT '+@col+'
        FROM #Att att
        WHERE att.AssetID = asset.AssetID
        FOR JSON path, WITHOUT_ARRAY_WRAPPER
    ) Attributes
FROM #Asset asset') 

结果:

+---------+--------------------------------------+
| AssetID |              Attributes              |
+---------+--------------------------------------+
|       1 | [{"height":"100px","width":"200px"}] |
+---------+--------------------------------------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用python将具有相同键值对的json对象合并到文件中

如何使用PHP计算JSON数组中存在具有特定键值对的对象的安装次数

如何从json数组列中获取具有特定键值的json对象?

如何将json对象插入到mysql表中

如何在具有JSON字符串的Java脚本对象中访问特定的键值对

如何使用 SQL 查询将 JSON Web 服务数据插入到 SQL 表中?

当Json文件具有相同的键值时如何使用HashMap

如何解析具有动态键值对的javascript中的json?

如何使用php将所有数组(来自URL)循环JSON到HTML表中

如何使用数组 .filter() 在 JSON 对象数组中搜索键值

如何使用JavaScript在现有JSON对象中添加新的键值对?

如何使用 ServiceStack 将 POCO 存储到具有复杂类型(对象和结构)作为 JSON 的 MariaDB?

如何获取 json 对象中的键值(Python)

使用 SQL 查询从键中具有特殊字符的 JSON 对象中获取值

如何将具有树结构的表聚合到单个嵌套的JSON对象?

如何使用“ json”模块在Plotly中实现具有json类型数据的表?

当具有中间 json“数据”属性时,如何将 api 响应的 JSON 对象关联到 java 类?

如何使用PHP从数据库将数据存储到具有变量名的json.file中

如何在Java中将具有复合键的键值结构映射到json对象

如何从具有单个“键值”的JSON对象中提取单个值?

如何使用TSQL将JSON列解析到表

如何将具有JSON属性的对象自动映射到没有JSON属性的对象?

如何使用 DataContractJsonSerializer 解析具有可变键名的 json 对象

如何使用json插入具有非空列的表?

使用查询将 Gist 中的 JSON 加载到表中

如何使用杰克逊mixins将json映射到具有不同结构的java对象

如何使用curl将具有数组的json对象放入

如何将具有键值的JSON文件转换为Apache骆驼标头-Spring DSL

如何使用JSON对象填充淘汰表