json - 过滤存储在 PostgreSQL 表中的 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 个键(sections),每个键都是一个带有一组键(tests)的对象,带有一个结果和一组成对的变量结果(key, value)
。
我需要根据内部 JSON 键进行过滤。更具体地说,在这个例子中,我想知道是否有可能单独使用 SQL 来获取例如结果std
部分中的值高于某个阈值(例如 10)的元素。我什至可以知道在 中,但我不知道先验在哪个部分。例如,使用此过滤器 ( ),将显示带有上述示例数据的记录,因为测试中的变量的值等于 21. (>10.)。std
test2
test2.std > 10.
std
test2
另一个更简单的过滤器可能是请求所有不是的test2.outcome
记录nominal
。
解决方案
一种方法是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
推荐阅读
- java - Jboss 7.1 中的 com.fasterxml.jackson.databind.JsonMappingException
- r - 将列表拆分为R中的单独数据框
- r - 将训练数据映射到元数据
- sql-server - 如何添加/设置开始日期和结束日期字段默认为报告期间的第一天
- excel - 从外部源数据源提取 Excel 数据不起作用
- linux - Linux - more efficient way to calculate price values within a file
- android - 数据库架构未更改时收到“房间无法验证数据完整性”错误消息
- angular - 从 Angular 项目中卸载包
- notifications - Twilio - 如何在所有子账户中使用全球 twilio 号码(已经为主账户购买了 twilio 号码)
- github-actions - 如何在程序上命名工件?