arrays - PostgreSQL 数组数据类型到 JSON 对象
问题描述
我正在尝试将 postgreSQL(11.4 版)表输出到视图中的 JSON 对象,其中一列是需要一些特殊格式的 INT 数组。该数组可以包含 4 到 10 个元素。
如果列(代码中的 col_arr)包含 {2, 4, 6, 8, 9},
我需要输出看起来像 {"option_1" : 2, "option_2" : 4, "option_3" : 6, "option_4" : 8, "option_5" : 9}
我尝试了大约五十种不同的功能组合,下面的代码是我想出的,它实际上产生了我需要的东西。它看起来很可怕,而且我知道必须有一个更简单的解决方案,但我不知道它会是什么。任何建议,将不胜感激。
SELECT cast('{ ' || string_agg('"' || propname || '" : ' || propval,' , ') || ' }' as json) as col_arr
FROM (SELECT t.table_id, a.elem as propval, 'option_' || a.nr as propname
FROM t_table AS t
LEFT JOIN LATERAL unnest(col_arr)
WITH ORDINALITY AS a(elem, nr) ON true) pt
GROUP BY table_id
解决方案
您可以使用json_object_agg()
:
select table_id, json_object_agg(format('option_%s', ord), value) as col_arr
from t_table as t
cross join unnest(col_arr) with ordinality as a(value, ord)
group by table_id
推荐阅读
- mongodb - MongoDB 聚合查询执行缓慢
- mysql - 用于将特定列与同一列的平均值进行比较的 SQL 查询
- android - MPAndroidChart LineChart 未正确绘制
- r - 将派对包用于决策树图时,导致此错误消息的原因是什么?
- python - 从日期时间中去除微秒
- android - 如何让这个 ViewModelFactory 更灵活并接受不同种类的 ViewModel 类?
- api - DocuSign API - 在每个文档的末尾添加签名页面
- angular - 如何将第三个状态添加到复选框?
- html - 为什么 input[type=checkbox] 不允许 CSS?
- ios - 由图像视图剪辑到边界的 CAShapeLayer