PostgreSQL对象交集数组

zqdjd7g9  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(1)|浏览(168)

假设我的数据库中有一些行,其中有一个JSONB列包含一个项目数组,如下所示:

[
  {"type": "human", "name": "Alice"},
  {"type": "dog", "name": "Fido"},
  {"type": "dog", "name": "Pluto"}
]

我需要能够查询基于此列的行。我要编写的查询是一个检查,以查看我的数组参数是否在任何点与此列相交。
例如:

  • 如果我搜索[{"type": "human", "name": "Alice"}],应该会找到匹配项。
  • 如果我搜索[{"type": "human", "name": "Alice"}, {"type": "dog", "name": "Doggy"}],我也会得到一个匹配(因为其中一个对象相交)

我试过使用?|操作符,但是根据文档,只能通过键进行比较,我需要匹配整个jsonb对象

bvjveswy

bvjveswy1#

您可以将existscross join一起使用:

select t.* from tbl t where exists (select 1 from jsonb_array_elements(t.items) v 
   cross join jsonb_array_elements('[{"type": "human", "name": "Alice"}, {"type": "dog", "name": "Doggy"}]'::jsonb) v1 
   where v.value = v1.value)

See fiddle.
作为函数:

create or replace function get_results(param jsonb) 
  returns table(items jsonb)
as $$
  select t.* from tbl t where exists (select 1 from jsonb_array_elements(t.items) v 
   cross join jsonb_array_elements(param) v1 
   where v.value = v1.value)
$$ language sql;

See fiddle.

相关问题