Implémentation de json_object_agg () dans Postgres 9.3

9

J'ai l'impression d'avoir besoin de la json_object_agg()fonction de Postgres 9.4 mais je ne pourrai pas mettre à jour à partir de 9.3 pour le moment. Existe-t-il un moyen de faire ce que je veux en 9.3? Voici mon scénario. J'ai un tableau click_activityde données qui ressemble à

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

Mais je veux le transformer en ceci: (agréger l'activité par utilisateur)

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

Je pense que la json_object_agg()fonction de Postgres 9.4 le ferait parfaitement, tout ce que j'aurais à appeler c'est

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

Existe-t-il un moyen de le faire en 9.3? Je vous remercie!

thomaskeefe
la source
1
Il pourrait être relativement facile d'extraire la fonction et de l'envelopper dans une extension C ...
Craig Ringer
Pouvez-vous utiliser pl / v8?
Clément Prévost

Réponses:

9

J'ai pu émuler json_object_agg en utilisant string_agg (qui est disponible en 9.3).

Votre exemple serait:

select user, ('{' || string_agg('"' || offer || '": ' || clicks, ',') || '}')::json as activity 
from click_activity 
group by user
Bert Hartmann
la source
Cela n'effectuera pas correctement les évasions. Si les valeurs contiennent des guillemets ou d'autres caractères avec des significations spéciales dans JSON, cela génère une erreur ou génère un résultat incorrect.
jpmc26
Cela peut être corrigé remplacerez le manuel cité avec juste un to_jsonappel: ('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::json. Des guillemets sont ajoutés automatiquement autour de la offervaleur lors de la concaténation.
jpmc26
0

Utilisez au lieu de json_object_agg => json_agg

select user, json_agg((offer, clicks)) from click_activity group by 1
sara GHOZALI
la source
1
, Bienvenue sur StackExchange. Veuillez ajouter quelques notes liées à la requête, pour une meilleure compréhension.
Md Haidar Ali Khan