如何在 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