筛选存储在PostgreSQL表中的JSON内部键
我有一个JSON格式的报告存储在PostgreSQL数据库表的一个字段中。 假设(简化)表格格式为:筛选存储在PostgreSQL表中的JSON内部键,json,postgresql,filter,Json,Postgresql,Filter,我有一个JSON格式的报告存储在PostgreSQL数据库表的一个字段中。 假设(简化)表格格式为: Column | Type -------------------+---------------------------- id | integer element_id | character varying(256) report | json 报告中的数据结构是这样的
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
哇,我没有意识到这种可能性,这真的让我很开心!这个例子比我实际拥有的要简单,但您的解决方案具有足够的可扩展性,而且。。。我测试过了,效果很好!