将 JSON 转换为 PostgreSQL 表

问题描述 投票:0回答:1

我已经有了这个 JSON 数据,我想做的是将其键和值组织成表格格式:

my_json = '[
    {
        "home": "team1",
        "away": "team2",
        "odds": {
            "periods": {
                "1": {
                    "scoring_types": {
                        "1": {
                            "bet_types": {
                                "1": {
                                    "outcomes": {
                                        "1": 1.85,
                                        "3": 3.85,
                                        "2": 6.50
                                    },
                                    "param": null
                                },
                                "2": {
                                    "outcomes": {
                                        "1": 1.9,
                                        "2": 1.9
                                    },
                                    "param": 8.5
                                }
                            }
                        }
                    }
                }
            }
        }
    }
]'

生成的表格应如下所示:

离开 scoring_type_id periods_id 投注类型 结果 参数 价值
团队1 团队2 1 1 1 1 1.85
团队1 团队2 1 1 1 2 6.5
团队1 团队2 1 1 1 3 3.85
团队1 团队2 1 1 2 1 8.5 1.9
团队1 团队2 1 1 2 2 8.5 1.9

代表列名称的键:

home,  away , scoring_type_id , periods_id, bet_types , outcomes,  param
value
是一致的并且始终存在。但是,不是列名称的键的数量可能会有所不同,例如多种类型的
period
scoring_type
。目标是为
outcomes
下找到的每个十进制值生成一行,同时维护表中显示的父键。

目前,我已经成功为前三列编写了一个查询,但我在访问嵌套键/值方面遇到了困难。

SELECT
  home,
  away,
  (st).key AS scoring_type_id
FROM (
  SELECT
    home,
    away,
    json_each_text(odds->'scoring_types') AS st
  FROM
    json_to_recordset(my_json
  ) AS data(home TEXT, away TEXT, odds JSON)
);
json postgresql
1个回答
0
投票

您需要

jsonb_each()
一直沿着结构。

  1. 使用
    jsonb
    使您的表格保持轻便,可转位,得益于附加功能和运算符,可以快速轻松地进行查询。如果这不适合您,您可以通过删除
    json
    将下面的所有功能切换为其常规
    b
    变体。
  2. 我故意使用
    ,
    来缩短 cross join lateral
     
    ,但请记住,即使您小心使用,逗号也常常会被人皱眉。

db<>fiddle 的演示:

select elem->>'home' as home, elem->>'away' as away, scoring_type_id, periods_id, bet_type_id as bet_types, outcomes, bet_type->>'param' as param, value from my_table ,jsonb_array_elements(my_json) as a(elem) ,jsonb_each(elem->'odds') as e(e_key,periods) ,jsonb_each(periods) as p1(periods_id,period) ,jsonb_each(period) as p2(p2_key,scoring_types) ,jsonb_each(scoring_types)as s1(scoring_type_id,scoring_type) ,jsonb_each(scoring_type) as s2(s2_key,bet_types) ,jsonb_each(bet_types) as b1(bet_type_id,bet_type) ,jsonb_each(bet_type->'outcomes') as b2(outcomes,value)
家离开scoring_type_idperiods_id投注类型结果参数价值团队1团队211111.85团队1团队211126.50团队1团队211133.85团队1团队211218.51.9团队1团队211228.51.9
© www.soinside.com 2019 - 2024. All rights reserved.