【问题标题】:Create nested json blobs in PostgreSQL在 PostgreSQL 中创建嵌套的 json blob
【发布时间】:2019-08-16 22:39:03
【问题描述】:

我正在尝试从这样的表中创建一个嵌套的 json:

+----------+---------+------------------------------+
| unixtime | assetid |             data             |
+----------+---------+------------------------------+
|       10 |      80 | {"inflow": 10, "outflow": 2} |
|       20 |      90 | {"inflow": 10, "outflow": 2} |
|       10 |      80 | {"inflow": 10, "outflow": 2} |
|       20 |      90 | {"inflow": 10, "outflow": 2} |
+----------+---------+------------------------------+

得到这样的东西:

{
    "10": {
        "80": {"inflow": 10, "outflow": 2},
        "90": {"inflow": 10, "outflow": 2}
    },
    "20": {
        "80": {"inflow": 10, "outflow": 2},
        "90": {"inflow": 10, "outflow": 2}
    }
}

我尝试将 json 数据递归转换为文本,array_agg 然后使用 json_object 将结果转换为 json blob,但最终用转义斜杠 (\) 搞砸了 json 结构。

任何帮助将不胜感激

这是数据的链接:

https://dbfiddle.uk/?rdbms=postgres_11&fiddle=26734e87d4b9aea4ceded4e414acec4c

谢谢。

【问题讨论】:

    标签: sql json postgresql


    【解决方案1】:

    你可以使用json_object_agg()函数:

    ....
    , m as (
    select
        unixdatetime,
        assetid,
        json_object(array_agg(description), array_agg(value::text))
        as value
    from input_data
    group by unixdatetime, assetid
    ), j as
    (
    select json_object_agg("assetid","value") as js,m."unixdatetime"
      from m
     group by "unixdatetime" 
    )
    select json_object_agg("unixdatetime",js)
      from j
    

    【讨论】:

    • 谢谢!不敢相信我在这上面花了 2 个小时。这看起来比 json_object 和数组 agg 更干净、更快捷,不是吗?
    猜你喜欢
    • 2023-02-23
    • 1970-01-01
    • 2023-02-03
    • 2023-03-26
    • 2016-04-13
    • 2021-08-24
    • 1970-01-01
    • 2016-09-02
    • 2022-01-16
    相关资源
    最近更新 更多