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文档非常棒。 至于搜索查询方法,重要的是要知道
查询可以是以下内容:
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; |