2016-11-20 37 views
0

我正在使用PostgreSQL 9.5和JSONB数据类型来存储文档。我的表是这样的:如何使用Postgres 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 
    } 
    ] 
} 

的问题是,我希望能够在entriesname属性过滤器数组,我只是无法弄清楚。我希望能够在我的表中找到部分与对象列表中的某个名称匹配的行。

我读了很多关于索引和表达式的东西,但我似乎无法让它工作。这不可能吗?

回答

1

这是我不清楚预期的结果是什么,但像这样将工作:

select r.id, e.* 
from records r 
    cross join lateral jsonb_array_elements(r.data -> 'entries') as e 
where e ->> 'name' like '%Doe%'; 

为了能够将每个数组元素访问你需要“UNNEST”他们(即正常化非规范化文件)。请注意,以上内容将为每个匹配数组元素返回一行,而不是针对表中的每一行。

您还可以移动的名称检查到存在子查询,如果你需要从基础表中是唯一完整行:

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

两种说法之间的区别是,第一查询将只有你向你展示匹配的数组元素。如果至少有一个匹配项,第二个将显示全部文档的数组元素。

+0

这似乎工作。我想我可以用某种方式处理可能的重复。 – fiskeben

+0

这些不重复。这些是你数组中的多个值。但是您可以使用'exists'查询来从基表中获取唯一的唯一行。 –

相关问题