在PostgreSQL中查询JSON对象数组中的条件

时间:2018-08-09 19:29:31

标签: arrays json postgresql

假设我们有一个PostgreSQL数据库,其中的表具有以下类型的行:

id | doc
---+-----------------
1  | JSON Object
2  | JSON Object
3  | JSON Object
...

JSON具有以下结构:

{
'header' : {
    'info' : 'foo'},
 'data' : 
[{'a' : 1, 'b' : 123},
 {'a' : 2, 'b' : 234},
 {'a' : 1, 'b' : 543},
 ...
 {'a' : 1, 'b' : 123},
 {'a' : 4, 'b' : 452}]
}

在表的所有行中对“数据”中的“ a”和“ b”具有任意值。

第一个问题:如何查询具有以下条件的表中的行:

列表/数组中有一个字典,键为“数据”,其中a == i和b> j。

例如对于i = 1和j = 400,上面的示例将满足条件,并将返回相应的列。

第二个问题: 在我的问题中,我必须处理Json中的时间序列数据。每次测量都由一个Json表示,因此表中的一行。我想确定发生某些事件的度量。对于上述结构在查询方面不适合的情况:这样的时间序列看起来如何更易于查询?

非常感谢!

1 个答案:

答案 0 :(得分:1)

我相信这样的查询可以回答您的第一个问题:

select distinct id, doc
from (
    select id, doc, jsonb_array_elements(doc->'data') as elem
    from docs
  ) as docelem
where (elem->>'a')::int = 4 and (elem->>'b')::int > 400

db <>提琴here