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

pl / v8を使用できますか?
クレメントプレヴォスト

回答:


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へようこそ。理解を深めるために、queryに関連するいくつかのメモを追加してください。
Md Haidar Ali Khan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.