所以想象一下我有一个带有 jsonb 列的表data
(为了举例,不是因为它是一个好的列名),其中包含一个 json 对象数组,其键states
是美国州缩写数组:
[ { states: ['AZ', 'CA'], ... }, { states: ['NY','CO'], ... }, ... ]
我想将 JSON 对象中的所有状态聚合到不同状态的列表中,并将其放入生成的存储列中states
。 (例如['AZ', 'CA', 'NY', 'CO', ...]
)
select
列出这样一个列表的一个不太好的方法是:
select jsonb_path_query_array(
( select jsonb_agg(b) from
(select distinct jsonb_array_elements(a) as state from jsonb_array_elements(
jsonb_path_query_array(data, '$[*].states')
) as a) as b
), '$[*].state') as states
from myTable
对于像通过键映射数组states
并调用 is 的任何 PG 等效项这样简单的事情来说flatten
,(a)似乎过于复杂,并且(b)select
其中包含,因此不能用于生成的列。
我可以想象的其他方法都涉及横向连接。
鉴于所有数据都在一个列中,似乎应该可以对其进行某种转换,而无需选择或连接来创建生成的存储列。但我似乎无法弄清楚如何在不使用select
and/or 的情况下做到这一点join lateral
。
有没有办法对 PostgreSQL 中生成的存储列执行此操作?
(目前在 PG 16.x 上)