PostgreSQL 11数据库中JSON数据扁平化处理技术求助
解决PostgreSQL 11中JSON数据扁平化的问题
没问题,这个需求在PostgreSQL 11里可以通过组合内置的JSON函数轻松实现,下面是具体的解决方案:
假设你的表结构
假设你的表名为vehicle_features,存储JSON数据的字段名为feature_data(类型为json),表中每行是你提供的单个JSON对象,比如:
CREATE TABLE vehicle_features (feature_data json); INSERT INTO vehicle_features VALUES ('{"Exterior Lights" :["Headlights - Forward Adaptive","Headlights - Laser","Headlights - LED"]}'), ('{"Generic" : ["Launch Control"]}'), ('{"Mirror" :["Blind Spot Assistant","Door Mirrors - Integrated LED"]}'), ('{"Safety" :["Tyre Pressure Monitoring", "ABS"]}');
实现扁平化的SQL语句
执行下面的SQL就能得到你期望的输出格式:
SELECT key AS "System", json_array_elements_text(value) AS "Type" FROM vehicle_features, json_each(feature_data);
语句解释
json_each(feature_data):这个函数会把每行的JSON对象拆分为键值对行,其中key就是你需要的System名称(比如"Exterior Lights"),value则是对应的JSON数组。json_array_elements_text(value):这个函数会把JSON数组中的每个元素展开为单独的行,和对应的key(System)关联,最终得到每行一个System+Type的结构。
如果字段是jsonb类型
如果你的JSON字段类型是jsonb(PostgreSQL中更推荐使用jsonb),只需要把函数换成jsonb_each和jsonb_array_elements_text即可:
SELECT key AS "System", jsonb_array_elements_text(value) AS "Type" FROM vehicle_features, jsonb_each(feature_data);
执行以上语句后,输出结果就会和你期望的完全一致:
| System | Type |
|---|---|
| Exterior Lights | Headlights - Forward Adaptive |
| Exterior Lights | Headlights - Laser |
| Exterior Lights | Headlights - LED |
| Generic | Launch Control |
| Mirror | Blind Spot Assistant |
| Mirror | Door Mirrors - Integrated LED |
| Safety | Tyre Pressure Monitoring |
| Safety | ABS |
内容的提问来源于stack exchange,提问作者user2699504
相关产品推荐
相关产品推荐

