如何从 jsonb 数组 postgres 中提取?

How to extract from jsonb array postgres?

我的一个专栏包含以下数组。我只需要 order_lookup_code。我该怎么做?

vendor_provided_data
{"vendor_data": [{"order_id": 10000, "shipment_id": 20000, "order_lookup_code": "fr_30000dd"}]}

我假设 vendor_provided_data 是您的 jsonb 列。 此查询将 return 您选择 order_lookup_code 的 table 装运的所有记录。

select jsonb_array_elements(vendor_provided_data->'vendor_data')->>'order_lookup_code' order_lookup_code
from shipment 
where 1 = 1

如果您想要多列,则每列需要一个表达式,例如

select vendor_provided_data #>> '{vendor_data, 0, order_lookup_code}' as code_1,
       vendor_provided_data #>> '{vendor_data, 1, order_lookup_code}' as code_2,
       vendor_provided_data #>> '{vendor_data, 2, order_lookup_code}' as code_3,
       ...
from the_table

#>> 运算符沿着“路径”从 JSON 值中提取“嵌套”元素,其中数组的每个元素指定路径中的一个步骤。使用多个 -> 运算符可以实现相同的效果。 {vendor_data, 0, 'order_lookup_code'} 等同于 -> 'vendor_data' -> 0 -> 'order_lookup_code'

如果多行都可以,可以用jsonb_array_elements()

select t.id, --<< whatever columns you want from the table
       vd.item ->> 'order_lookup_code' as lookup_code
from the_table t
  cross join jsonb_array_elements(t.vendor_provided_data -> 'vendor_data') as vd(item)

如果您使用的是 Postgres 12 或更高版本,您可以将所有代码提取为单个 JSON 数组:

select jsonb_path_query_array(vendor_provided_data, '$.vendor_data[*].order_lookup_code') as all_codes
from the_table