json - postgres 从 json 字段中选择作为每个键的列
问题描述
我有 Items (id, data (json)) 表。数据列结构是这样的:
"somethingNotImportant":{
"someName":"Its a name",
"someProduct":"its a product"
},
"anotherNotImportant":{
"installments":null,
"baseRate":"30",
"grossComm":"20",
"totalMileage":null
},
"fleetdetails":{
"4b4bd441-a8eb-4754-9384-6f97d1ee23e3":{
"vehicleType":"43572386-5908-4e46-bf2b-3948df2e0e72",
"usage":"Class 3",
"carBand":"N\/A",
"coverType":"Third-Party Only",
"vehicleNumber":"1",
"modelRate":"222",
"technicalRate":"333",
"annualMileage":"444",
"adftExcess":"555",
"wsExcess":"777",
"annualBasePremium":null,
"usageRate":null
},
"cc12cc77-9346-4cae-8c27-6afc8b457f9b":{
"vehicleType":"fa999a90-b98f-499a-bef6-55b9a208c2fc",
"usage":"Class 1",
"carBand":"N\/A",
"coverType":"Comprehensive",
"vehicleNumber":"1",
"modelRate":"2",
"technicalRate":"3",
"annualMileage":"4",
"adftExcess":"5",
"wsExcess":"6",
"annualBasePremium":null,
"usageRate":null
}
}
}
我想选择并获得这样的舰队详细信息结果:
item.id | 车辆类型 | 用法 | 车带 | |
---|---|---|---|---|
1 | 43572386-... | 3 级 | 不适用 | |
1 | fa999a90-... | 1级 | 不适用 | 等等。 |
如果我不知道fleetdetails json id,我怎么能做到这一点?
解决方案
您可以使用jsonb_each()
:
select i.id,
d.detail ->> 'vehicleType' as vehicle_type,
d.detail ->> 'usage' as usage,
d.detail ->> 'carBand' as car_band
from item i
cross join jsonb_each(i.data -> 'fleetdetails') as d(key, detail);
这假设该列data
被定义为jsonb
(它应该是)。如果它只是一个json
列,则必须json_each()
改用。
推荐阅读
- javascript - 如何忽略标准中的 eslint 规则
- redux - Redux 在 ui 上创建新对象
- scala - 具有相同运行时类但不同静态类型的对象的不同性能
- android - 如何获取 Spinner 值以保存在变量中
- c# - await Task.Delay(0) Runs OK but await Task.Delay(1000) Does not
- html - iframe 的对齐方式
- entity-framework - 无法更新数据库以匹配当前模型...但仅在两个应用程序之一上
- flutter - FLUTTER:如何知道用户是否退出了退出应用程序?
- python - fit_generator 期望所有神经网络层的输入?
- java - JavaFX 不会导入