【问题标题】:Postgres JSONB: query values in JSON arrayPostgres JSONB:查询 JSON 数组中的值
【发布时间】:2015-11-28 05:54:20
【问题描述】:

Postgres 9.4

我有一条 JSONB 值如下的记录:

{
  "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 都在 100 的 10 分以内)。

不幸的是,我真的在为 JSONB 查询语法苦苦挣扎。最好的方法是什么?

【问题讨论】:

    标签: postgresql psql


    【解决方案1】:

    Postgres documentation regarding json 真的很棒。至于搜索查询方法,重要的是要知道->> 返回text-> 返回json(b)

    查询可以如下:

    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);
    

    如果您想通过索引选择特定的数组元素,在您的情况下查询将如下:

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

    【讨论】:

    • 谢谢,这很有帮助。但是,还有一种方法可以查询数组的特定索引吗?例如如果 arrayAttribute[0].attributeC = 50 和 arrayAttribute[1].attributeC = 100?
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 2021-12-12
    • 2018-03-29
    • 2016-06-14
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多