Postgresql:如何在不使用中间 hstore 的情况下将键值表转换为 json

Posted

技术标签:

【中文标题】Postgresql:如何在不使用中间 hstore 的情况下将键值表转换为 json【英文标题】:Postgresql: how to convert a key value table into json without using an intermediate hstore 【发布时间】:2016-06-12 09:17:17 【问题描述】:

我有一个具有这种形式的键值 postgresql 表

pk | fk | key | value
---|----|-----|------
1  | 11 | k1  | v1
2  | 11 | k2  | v2
3  | 22 | k3  | v3
4  | 33 | k1  | v1
5  | 33 | kk  | vk
6  | 33 | kn  | vn

我需要转换为按 fk 分组的 json 对象:

fk | kv
---|------------
11 | "k1": "v1", "k2": "v2"
22 | "k3": "v3"
33 | "k1": "v1", "kk": "vk", "kn": "vn"

我已经找到了一种使用中间 hstore 转换的方法:

SELECT fk, hstore_to_json(hstore(array_agg(key), array_agg(value))) as kv
FROM tbl
GROUP BY fk, pk;

问题是,我无法在生产环境中使用 hstore 扩展,而且我无法安装它,是否有其他方法可以获得相同形式的输出?

PS:postgresql版本是9.4.8

【问题讨论】:

【参考方案1】:

其实和hstore的版本很像:

SELECT fk, json_object(array_agg(key), array_agg(value)) AS kv
FROM tbl
GROUP BY fk
ORDER BY fk;

产量:

fk |                 kv
---+------------------------------------------
11 | '"k1" : "v1", "k2" : "v2"'
22 | '"k3" : "v3"'
33 | '"k1" : "v1", "kk" : "vk", "kn" : "vn"'

【讨论】:

这对我有用,我没注意这个构造函数 json_object(keys text[], values text[])

以上是关于Postgresql:如何在不使用中间 hstore 的情况下将键值表转换为 json的主要内容,如果未能解决你的问题,请参考以下文章

如何在不指定数据库名称的情况下连接到 PostgreSQL?

PostgreSQL:如何在不延迟插入响应的情况下执行插入触发器?

PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?

如何在不先定义表中的列的情况下将数据加载到 PostgreSQL 中?

如何在不使用 redux 中间件的情况下禁用/隐藏自适应卡片/操作按钮?

如何在不显示中间视图的情况下通过多个视图展开