关于postgresql:Postgres JSONB:JSON数组中的查询值

Postgres JSONB: query values in JSON array

Postgres 9.4

我有一个像这样的JSONB值的记录:

1
2
3
4
5
6
7
8
{
 "attributeA": 1,
 "attributeB":"Foo",
 "arrayAttribute": [
   {"attributeC": 95,"attributeD": 5},
   {"attributeC": 105,"attributeD": 5}
  ]
}

我想写一个查询说:

找到attributeA = 1,attributeB ='Foo'的任何项目,并且对于arrayAttribute数组中的每个元素,attributeC在某个值X的10点范围内。因此,如果X为100,则上述记录将匹配(95和 105与10)在10分之内。

遗憾的是,我真的很难使用JSONB查询语法。 最好的方法是什么?


有关json的Postgres文档非常棒。 至于搜索查询方法,重要的是要知道->>返回text->返回json(b)

查询可以是以下内容:

1
2
3
4
5
SELECT * FROM json js,jsonb_array_elements(data->'arrayAttribute') AS array_element  
WHERE (js.data->>'attributeA')::INTEGER = 1
AND js.data->>'attributeB' = 'Foo'
AND (array_element->>'attributeC')::INTEGER >= (100-5)
AND (array_element->>'attributeC')::INTEGER <= (100+5);

如果要按索引选择特定的数组元素,在您的情况下查询将如下所示:

1
2
3
SELECT * FROM json js,jsonb_extract_path(DATA,'arrayAttribute') AS entireArray
WHERE (entireArray -> 0 ->> 'attributeC')::INTEGER = 95
AND (entireArray -> 1 ->> 'attributeC')::INTEGER = 105;