postgresql 在postgres中,是否可以在jsonb中过滤数组而不进行过滤?

zbdgwd5y  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(48)

我想知道是否有可能在jsonb中过滤数组而不过滤整个表或取消嵌套?
假设我有一张table:
| ID| jsnob|
| --|--|
| 1 |第一个月|
| 2 |{"names":["anna"]}个|
| 3 |{"names":["peter"]}个|
我想有相同的表,但这样的名字被过滤,只有从“a”开始的名字:
| ID| jsnob|
| --|--|
| 1 |{"names":["anna", "armin"]}个|
| 2 |{"names":["anna"]}个|
| 3 |{"names":null}个|
我用unnest(jsonb_array_elements)实现了它,然后group by回到json,但它相当慢。我想知道是否有更快的方法?

pgvzfuti

pgvzfuti1#

您可以使用标量子查询逐个记录地执行此操作,而无需展平整个表,然后重新分组。

update the_table 
set "jsonb" = jsonb_set("jsonb", '{names}',
  (select jsonb_agg(e) from jsonb_array_elements_text("jsonb"->'names') e where e ~* '^a')
);

字符串
DB Fiddle

注意以上并不保证数组元素的顺序保持不变。严格来说,请使用下面的标量子查询。

(
 select jsonb_agg(e ORDER BY i) 
 from jsonb_array_elements_text("jsonb"->'names') WITH ORDINALITY t(e, i)
 where e ~* '^a'
)

相关问题