筛选存储在PostgreSQL表中的JSON内部键

筛选存储在PostgreSQL表中的JSON内部键,json,postgresql,filter,Json,Postgresql,Filter,我有一个JSON格式的报告存储在PostgreSQL数据库表的一个字段中。 假设(简化)表格格式为: Column | Type -------------------+---------------------------- id | integer element_id | character varying(256) report | json 报告中的数据结构是这样的

我有一个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个键,每个键都是一个对象,具有一组键(测试),结果和一组可变的结果,其形式为
(键,值)

我需要根据内部JSON键进行过滤。更具体地说,在本例中,我想知道是否可以仅使用SQL来获取结果部分中的
std
值高于某个阈值(例如10)的元素。我甚至可以知道
std
test2
中,但我不知道是在哪个部分。例如,使用此过滤器(
test2.std>10.
),将显示上面显示的样本数据记录,因为
test2
测试中的
std
变量的此值等于21。(>10.).


另一个更简单的过滤器可以是请求
test2.outcome
不是
nominal
的所有记录,一种方法是
jsonb\u 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

哇,我没有意识到这种可能性,这真的让我很开心!这个例子比我实际拥有的要简单,但您的解决方案具有足够的可扩展性,而且。。。我测试过了,效果很好!