我有一个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
的所有记录。
答案 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