如何在 postgres jsonb 列中搜索特定键值?
How do I search for particular key values in postgres jsonb columns?
我想获取输入中接收到的具有特定 键值 对的所有行。为了。例如考虑以下数据:-
CREATE TABLE places(id int, place jsonb) ;
insert into places values (1, '{"country": {"name": "Brazil", "speak_portuguese": true, "river": "amazon"}}');
insert into places values (2, '{"name": "USA", "speak_portuguese": false, "river": "missisipi"}');
insert into places values (3, '{"continent": "South America", "speak_portuguese": true, "river": "amazon"}');
table 数据如下所示:-
现在,如果我的输入低于 键值,那么第 1 行和第 3 行应该出现在结果中,因为第 1 行和第 3 行中存在键值对。
{
"speaks_portuguese": true,
"river": "amazon"
}
我正在尝试使用 jsonb_path_exists,但遇到了困难。有人可以帮忙吗?
注意:key可以出现在任意层级的嵌套(如country->state->city等),一行可以有多个地方的数据。
由于这些值出现在不同的路径中,您可以使用 or
条件:
select *
from places
where place @> '{"speak_portuguese": true, "river": "amazon"}'
or place -> 'country' @> '{"speak_portuguese": true, "river": "amazon"}'
如果您不知道级别并且您使用的是 Postgres 12,则可以使用 JSON 路径表达式:
select *
from places
where place @@ '$.**.speak_portuguese == true && $.**.river == "amazon"'
select * from places
where (place->'speak_portuguese')::boolean is true
or (place->'country'->'speak_portuguese')::boolean
我想获取输入中接收到的具有特定 键值 对的所有行。为了。例如考虑以下数据:-
CREATE TABLE places(id int, place jsonb) ;
insert into places values (1, '{"country": {"name": "Brazil", "speak_portuguese": true, "river": "amazon"}}');
insert into places values (2, '{"name": "USA", "speak_portuguese": false, "river": "missisipi"}');
insert into places values (3, '{"continent": "South America", "speak_portuguese": true, "river": "amazon"}');
table 数据如下所示:-
现在,如果我的输入低于 键值,那么第 1 行和第 3 行应该出现在结果中,因为第 1 行和第 3 行中存在键值对。
{
"speaks_portuguese": true,
"river": "amazon"
}
我正在尝试使用 jsonb_path_exists,但遇到了困难。有人可以帮忙吗?
注意:key可以出现在任意层级的嵌套(如country->state->city等),一行可以有多个地方的数据。
由于这些值出现在不同的路径中,您可以使用 or
条件:
select *
from places
where place @> '{"speak_portuguese": true, "river": "amazon"}'
or place -> 'country' @> '{"speak_portuguese": true, "river": "amazon"}'
如果您不知道级别并且您使用的是 Postgres 12,则可以使用 JSON 路径表达式:
select *
from places
where place @@ '$.**.speak_portuguese == true && $.**.river == "amazon"'
select * from places
where (place->'speak_portuguese')::boolean is true
or (place->'country'->'speak_portuguese')::boolean