我已经有了这个 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)
);
jsonb_each()
一直沿着结构。
jsonb
使您的表格保持轻便,可转位,得益于附加功能和运算符,可以快速轻松地进行查询。如果这不适合您,您可以通过删除 json
将下面的所有功能切换为其常规 b
变体。,
来缩短 cross join lateral
,但请记住,即使您小心使用,逗号也常常会被人皱眉。
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)
空 | |||||||
空 | |||||||
空 | |||||||