首页 > 解决方案 > 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,我怎么能做到这一点?

标签: jsonpostgresql

解决方案


您可以使用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()改用。


推荐阅读