【问题标题】:Extract data from Postgres DB to a JSON multilevel hierarchy structure从 Postgres DB 中提取数据到 JSON 多级层次结构
【发布时间】:2019-04-23 22:12:39
【问题描述】:

我正在尝试将数据从 postgres 数据库提取到 JSON 文件。这里的问题是,我需要将多个层次结构中的数据加载到 JSON 文件中。

任何在 postgres SQL 查询或 python 中实现此目的的解决方案将不胜感激。

我尝试在一个级别上做,并通过 postgres 上的 json_agg() 查询成功,但不知道如何做超过 2 个级别。

这是我的 postgres 代码:

select
    json_build_object('column1',json_agg(
    json_build_object('name',column1,'column2',column2)))
     table1
from table;

which gives me :
[columns1:
{column2:value},
{column2:value2}
]

But what i need is:
eg: column1 column2 column3
    4       1       4
    4       4       5
    4       1       9
    2       3       7
    3       1       8
    1       1       1
    3       1       6

    output:
    [
    column1:4[{
      column2:1[{
        column3:4,
        colun3:9}]
    },
    { column2:4
      [{
        column3:5
      }]
    }]]

【问题讨论】:

    标签: python sql json postgresql hierarchy


    【解决方案1】:

    这里有两种不同的变体,因为您的输出不是有效的 JSON,因此有点难以猜测您想要哪种格式:

    以下两种变体具有相同的查询结构,只是它们创建 JSON 对象的方式不同。

    对于更多层次的层次结构,您需要更多的 CTE,例如 agg_c3,或者如果您愿意,您可以重写查询以使用嵌套的子选择(但它比 CTE 更难阅读)。

    封装的键值对

    WITH
        my_table (col1, col2, col3) AS (
            VALUES (4,1,4), (4,4,5), (4,1,9), (2,3,7), (3,1,8), (1,1,1), (3,1,6)
        ),
        agg_c3 AS (
            SELECT col1, col2, jsonb_build_object('column3', jsonb_agg(jsonb_build_object('value', col3))) AS col3
            FROM my_table
            GROUP BY 1, 2
        ),
        agg_c2 AS (
            SELECT col1, jsonb_build_object('column2', jsonb_agg(jsonb_build_object('value', col2) || col3)) AS col2
            FROM agg_c3
            GROUP BY 1
        )
    SELECT jsonb_build_object('column1', jsonb_agg(jsonb_build_object('value', col1) || col2)) AS json_object
    FROM agg_c2
    ;
    

    ...返回:

    {
      "column1": [
        {
          "value": 1,
          "column2": [
            {
              "value": 1,
              "column3": [
                {
                  "value": 1
                }
              ]
            }
          ]
        },
        {
          "value": 3,
          "column2": [
            {
              "value": 1,
              "column3": [
                {
                  "value": 8
                },
                {
                  "value": 6
                }
              ]
            }
          ]
        },
        {
          "value": 2,
          "column2": [
            {
              "value": 3,
              "column3": [
                {
                  "value": 7
                }
              ]
            }
          ]
        },
        {
          "value": 4,
          "column2": [
            {
              "value": 1,
              "column3": [
                {
                  "value": 4
                },
                {
                  "value": 9
                }
              ]
            },
            {
              "value": 4,
              "column3": [
                {
                  "value": 5
                }
              ]
            }
          ]
        }
      ]
    }
    

    仅值

    WITH
        my_table (col1, col2, col3) AS (
            VALUES (4,1,4), (4,4,5), (4,1,9), (2,3,7), (3,1,8), (1,1,1), (3,1,6)
        ),
        agg_c3 AS (
            SELECT col1, col2, jsonb_agg(col3) AS col3
            FROM my_table
            GROUP BY 1, 2
        ),
        agg_c2 AS (
            SELECT col1, jsonb_agg(jsonb_build_object(col2::text, col3)) AS col2
            FROM agg_c3
            GROUP BY 1
        )
    SELECT jsonb_agg(jsonb_build_object(col1::text, col2)) AS json_object
    FROM agg_c2
    ;
    

    ...返回:

    [
      {
        "1": [
          {
            "1": [
              1
            ]
          }
        ]
      },
      {
        "3": [
          {
            "1": [
              8,
              6
            ]
          }
        ]
      },
      {
        "2": [
          {
            "3": [
              7
            ]
          }
        ]
      },
      {
        "4": [
          {
            "1": [
              4,
              9
            ]
          },
          {
            "4": [
              5
            ]
          }
        ]
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 2014-07-23
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      相关资源
      最近更新 更多