在Postgres

时间:2017-06-10 02:47:30

标签: json postgresql

我正在尝试查询Postgres中的JSON数据结构(Amazon RDS上的9.6)。数据包含一个对象数组,而这些对象又包含一个包含对象数组的元素。我想找到与其中一个嵌套数组中的键+值匹配的所有记录。

给出这样的行:

{"drinkers" : [
  {"name" : "geoff", 
   "beers" : [
     {"name": "PBR"},
     {"name" : "Bud Select"}
    ]}, 
  {"name" : "tom", 
   "beers" : [
     {"name": "Bud Light"},
     {"name" : "Busch"}
    ]}
]}

我想找到所有的行,其中有一个名为“PBR”的drinkers.beers对象。我最接近的是:

select jsonb_data 
from bars 
where jsonb_array_elements(jsonb_array_elements(data -> 'drinkers') -> 'beers') ->> 'name' = 'PBR'``

但这不起作用,因为where返回一个列表而不是一个匹配的true / false。我已经提出了使用子查询,横向连接等的其他解决方案,但所有这些解决方案都存在性能问题,即使使用正确的杜松子酒索引也是如此。关于如何在Postgres中查询这样的数据结构的任何建议?

2 个答案:

答案 0 :(得分:3)

您是否尝试使用IN运算符?

WHERE 'PBR' IN (
  SELECT jsonb_array_elements(jsonb_array_elements(data -> 'drinkers') -> 'beers') ->> 'name'
);

另一种方法是使用JSONB contain(即@>):

WHERE data -> 'drinkers' @> '[{"beers": [{"name": "PBR"}]}]';

答案 1 :(得分:0)

很抱歉这可能只是一个评论,但如果返回名称的语句为您提供列表或数组,您可以使用'PBR' = ANY jsonb_array_elements(...吗?

相关问题