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 中?