如何使用 Postgres jsonb 在数组中搜索对象值?
How can I search object values inside an array with Postgres jsonb?
我正在使用 PostgreSQL 9.5 和 JSONB 数据类型来存储文档。我的 table 是这样的:
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
}
]
}
问题是我希望能够过滤 entries
数组中的 name
属性,但我无法弄明白。我希望能够在我的 table 中找到与对象列表中的名称之一部分匹配的行。
我已经阅读了很多关于索引和表达式之类的内容,但我似乎无法让它发挥作用。这不应该吗?
我不清楚预期的结果是什么,但像这样的东西会起作用:
select r.id, e.*
from records r
cross join lateral jsonb_array_elements(r.data -> 'entries') as e
where e ->> 'name' like '%Doe%';
为了能够访问每个数组元素,您需要 "unnest" 它们(即规范化非规范化文档)。请注意,上面将为每个匹配的数组元素 return 一行,而不是 table.
中的每一行
如果您需要来自基础 table:
的唯一完整行,您还可以将对名称的检查移至现有子查询
select r.*
from records r
where exists (select 1
from jsonb_array_elements(r.data -> 'entries') as e
where e ->> 'name' like '%Doe%');
这两个语句的区别在于,第一个查询只会显示匹配的数组元素。如果至少有一个匹配,第二个将显示文档的 all 数组元素。
我正在使用 PostgreSQL 9.5 和 JSONB 数据类型来存储文档。我的 table 是这样的:
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
}
]
}
问题是我希望能够过滤 entries
数组中的 name
属性,但我无法弄明白。我希望能够在我的 table 中找到与对象列表中的名称之一部分匹配的行。
我已经阅读了很多关于索引和表达式之类的内容,但我似乎无法让它发挥作用。这不应该吗?
我不清楚预期的结果是什么,但像这样的东西会起作用:
select r.id, e.*
from records r
cross join lateral jsonb_array_elements(r.data -> 'entries') as e
where e ->> 'name' like '%Doe%';
为了能够访问每个数组元素,您需要 "unnest" 它们(即规范化非规范化文档)。请注意,上面将为每个匹配的数组元素 return 一行,而不是 table.
中的每一行如果您需要来自基础 table:
的唯一完整行,您还可以将对名称的检查移至现有子查询select r.*
from records r
where exists (select 1
from jsonb_array_elements(r.data -> 'entries') as e
where e ->> 'name' like '%Doe%');
这两个语句的区别在于,第一个查询只会显示匹配的数组元素。如果至少有一个匹配,第二个将显示文档的 all 数组元素。