在Postgres 9.3中实现json_object_agg()


9

我觉得我需要json_object_agg()Postgres 9.4 的功能,但现在无法从9.3升级。有什么方法可以完成我在9.3版中想要的工作吗?这是我的情况。我有一个click_activity看起来像的数据表

user | offer | clicks
-----|-------|--------
fred |coupons| 3
fred |cars   | 1
john |coupons| 2

但是我想把它变成这样:(汇总每个用户的活动)

user | activity
-----|----------
fred | {"coupons": 3, "cars": 1}
john | {"coupons": 2}

我认为json_object_agg()Postgres 9.4 的功能可以完美地做到这一点,我只需要调用

select user, json_object_agg(offer, clicks) from click_activity group by 1

9.3中有办法吗?谢谢!


1
提取函数并将其包装在C扩展中可能相对容易...
Craig Ringer 2015年

可以使用pl / v8吗?
克莱门特·普雷沃斯特

Answers:


9

我能够使用string_agg(在9.3中可用)模拟json_object_agg。

您的示例将是:

select user, ('{' || string_agg('"' || offer || '": ' || clicks, ',') || '}')::json as activity 
from click_activity 
group by user

这将无法正确执行转义。如果值在JSON中包含引号或其他具有特殊含义的字符,则将抛出错误或生成不正确的结果。
jpmc26

可以通过仅用一个to_json呼叫代替手动报价来解决此问题('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::jsonoffer连接值时,会自动在值周围添加双引号。
jpmc26

0

使用代替json_object_agg => json_agg

select user, json_agg((offer, clicks)) from click_activity group by 1

1
,欢迎来到StackExchange。请添加一些有关查询的注释,以更好地理解。
海达尔·阿里·汗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.