过滤存储在PostgreSQL表中的JSON内部密钥

时间:2018-05-07 10:21:47

标签: json postgresql filter

我有一个JSON格式的报告存储在PostgreSQL数据库表的字段中。 说(简化)表格格式为:

      Column       |            Type
-------------------+----------------------------
 id                | integer
 element_id        | character varying(256)
 report            | json

报告中的数据结构如下

{
  "section1":
    "test1": {
      "outcome": "nominal",
      "results": {
        "value1": 34.,
        "value2": 56.
      }
    },
    "test2": {
      "outcome": "warning",
      "results": {
        "avg": 4.5,
        "std": 21.
      }
    },
    ...
  "sectionN": {
    ...
  }      
}    

也就是说,第一级有N个键( sections ),每个键都是一个带有一组键的对象( tests ), 结果以及(key, value)对形式的结果变量集。

我需要根据内部JSON密钥进行过滤。更具体地说,在这个例子中,我想知道是否可以单独使用SQL来获取具有例如 results 部分中的std值的元素。某个阈值,比如10.我甚至可以知道std位于test2,但我不知道先验在哪个部分。例如,使用此过滤器(test2.std > 10.),将显示包含上面显示的示例数据的记录,因为std测试中的test2变量的此值等于21.(> ; 10)。

另一个更简单的过滤器可能是请求test2.outcome不是nominal的所有记录。

1 个答案:

答案 0 :(得分:1)

一种方式是jsonb_each,例如:

select  section.key
,       test.key
from    t1
cross join
        jsonb_each(t1.col1) section
cross join
        jsonb_each(section.value) test
where   (test.value->'results'->>'std')::int > 10

Example at SQL Fiddle.