如何在PostgreSQL中将JSONB动态字段提取为指定列格式?
从PostgreSQL JSONB字段提取数据并转换为指定格式
要实现将JSONB字段中的指定数据展开为id、attributtename、value三列的格式,可以通过jsonb_each_text函数展开顶级字段,再单独提取嵌套的label字段,最后用UNION ALL合并结果。
解决方案SQL
SELECT t.id, kv.key AS attributtename, kv.value FROM mytable t CROSS JOIN jsonb_each_text(t.data) kv WHERE kv.key NOT IN ('_validation_status') -- 排除不需要展开的嵌套对象字段 UNION ALL SELECT id, 'label' AS attributtename, data->'_validation_status'->>'label' AS value FROM mytable ORDER BY id, attributtename;
说明
- 第一部分查询:使用
jsonb_each_text将data字段的顶级键值对展开,同时排除_validation_status这个嵌套对象字段,避免把整个对象作为值返回。 - 第二部分查询:直接提取
_validation_status中的label值,指定attributtename为label。 - 合并结果:通过
UNION ALL将两部分数据合并,最后按id和attributtename排序,得到目标格式。
执行结果
执行上述SQL后,将得到如下符合需求的结果:
| id | attributtename | value |
|---|---|---|
| 25 | _id | 25 |
| 25 | indicator 1 | yes |
| 25 | indicator 2 | yes |
| 25 | label | On Hold |
| 25 | start | 2023-07-03T22:03:30.948+05:30 |
| 26 | _id | 26 |
| 26 | indicator 1 | yes |
| 26 | indicator 2 | no |
| 26 | label | On Hold |
| 26 | start | 2023-07-03T22:03:30.948+05:30 |
内容的提问来源于stack exchange,提问作者sahil
相关产品推荐
相关产品推荐

