Arrays 如何使用Postgres jsonb在数组中搜索对象值?

Arrays 如何使用Postgres jsonb在数组中搜索对象值?,arrays,postgresql,jsonb,Arrays,Postgresql,Jsonb,我使用PostgreSQL 9.5和JSONB数据类型来存储文档。我的桌子是这样的: create table records ( id serial, data jsonb ); 我的文档包含一个对象数组,例如: { "some_field": "a value", "another_field": 123, entries: [ { "name": "John Doe", "age": 42 }, { "nam

我使用PostgreSQL 9.5和JSONB数据类型来存储文档。我的桌子是这样的:

create table records (
  id serial,
  data jsonb
);
我的文档包含一个对象数组,例如:

{
  "some_field": "a value",
  "another_field": 123,
  entries: [
    {
      "name": "John Doe",
      "age": 42
    },
    {
      "name": "Johnny McMuffin",
      "age": 117
    }
  ]
}
问题是我希望能够在
条目
数组中过滤
名称
属性,但我就是搞不清楚。我希望能够在表中找到与对象列表中的一个名称部分匹配的行


我读了很多关于索引、表达式和其他东西的书,但我似乎无法让它发挥作用。这难道不可能吗?

我不清楚预期的结果是什么,但类似的方法会奏效:

select r.id, e.*
from records r
  cross join lateral jsonb_array_elements(r.data -> 'entries') as e
where e ->> 'name' like '%Doe%';
为了能够访问每个数组元素,您需要“取消”它们(即,规范化非规范化文档)。请注意,上面将为每个匹配的数组元素返回一行,而不是表中的每一行

如果需要基表中唯一的完整行,还可以将名称上的检查移动到exist子查询:

select r.*
from records r
where exists (select 1 
             from jsonb_array_elements(r.data -> 'entries') as e
             where e ->> 'name' like '%Doe%');

这两个语句之间的区别在于,第一个查询只显示匹配的数组元素。如果至少有一个匹配项,则第二个将显示文档的所有数组元素

这似乎奏效了。我想我可以用某种方式处理可能的重复。那些不是重复的。这些是数组中的多个值。但是您可以使用
exists
查询从基表中仅获取唯一的行。