我有一个简单的postgres表:
Column │ Type │ Modifiers
──────────────┼──────────────────────┼──────────────────────
id │ integer │ not null default
data │ jsonb │
这是data
的简化数据结构:
{
"id": 3,
"date": "2019-01-01",
"well_report_table":
[
{"element": "methane",
"yield": 6,
"price": 2.10
},
{"element": "pentane",
"yield": 6,
"price": 2.10
},
{"element": "butane",
"yield": 6,
"price": 3.50
}
],
"cost_report_table":
[
{"item": "fuel",
"charge": 6.30
},
{"item": "lease",
"charge": 200
}
]
}
我想在带有以下各列的视图中将其展平:
id | date | well_report_table_methane_yield | well_report_table_methane_price | well_report_table_pentane_yield | well_report_table_pentane_price | well_report_table_butane_yield | well_report_table_butane_price |cost_report_table_fuel_charge | cost_report_table_lease_charge
我数组中的对象具有一个标识符,我想将其附加到数组对象名称中,然后遍历该对象中的其他键,并在 中创建列。
这个问题使我接近: Postgres: Flatten aggregated key/value pairs from a JSONB field?
我不确定是否可以在plpgsql之类的工具中实现此功能,因此,如果我只需要使用脚本语言(如ruby / python)生成视图文本,然后再基于该脚本创建视图,则可以那个。
理想情况下,我将能够使用诸如jsonb_array_elements
和jsonb_each
之类的东西来避免中间表(我目前的所有尝试都需要中间视图),但是我没有发现魔术组合。
答案 0 :(得分:1)
这不是关于展平JSON数组的一般问题,因为在数组中隐藏了特定的逻辑。您可以在此函数中实现逻辑:
create or replace function flat_array(data jsonb, title text, item text)
returns jsonb language sql immutable as $$
select jsonb_object_agg(format('%s_%s_%s', title, elem->>item, key), value)
from jsonb_array_elements(data->title) as arr(elem)
cross join jsonb_each(elem)
where key <> item
$$;
查询:
select
jsonb_build_object('id', data->'id', 'date', data->'date') ||
flat_array(data, 'well_report_table', 'element') ||
flat_array(data, 'cost_report_table', 'item')
from my_table
提供对象:
{
"id": 3,
"date": "2019-01-01",
"cost_report_table_fuel_charge": 6.30,
"cost_report_table_lease_charge": 200,
"well_report_table_butane_price": 3.50,
"well_report_table_butane_yield": 6,
"well_report_table_methane_price": 2.10,
"well_report_table_methane_yield": 6,
"well_report_table_pentane_price": 2.10,
"well_report_table_pentane_yield": 6
}
中所述的方式转换为表格视图