Implementierung von json_object_agg () in Postgres 9.3


9

Ich habe das Gefühl, ich brauche die json_object_agg()Funktion von Postgres 9.4, aber ich kann momentan kein Upgrade von 9.3 durchführen. Gibt es eine Möglichkeit, in 9.3 das zu tun, was ich will? Hier ist mein Szenario. Ich habe eine Datentabelle click_activity, die aussieht

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

Aber ich möchte daraus Folgendes machen: (Aggregation der Aktivität pro Benutzer)

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

Ich denke, dass die json_object_agg()Funktion von Postgres 9.4 dies perfekt machen würde, alles was ich aufrufen müsste wäre

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

Gibt es eine Möglichkeit, dies in 9.3 zu tun? Vielen Dank!


1
Es könnte relativ einfach sein, die Funktion zu extrahieren und in eine C-Erweiterung
Craig Ringer

Können Sie pl / v8 verwenden?
Clément Prévost

Antworten:


9

Ich konnte json_object_agg mit string_agg emulieren (verfügbar in 9.3).

Ihr Beispiel wäre:

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

Dadurch werden Escape-Vorgänge nicht ordnungsgemäß ausgeführt. Wenn die Werte in JSON Anführungszeichen oder andere Zeichen mit Sonderbedeutungen enthalten, wird entweder ein Fehler ausgegeben oder ein falsches Ergebnis generiert.
jpmc26

Dies kann behoben werden, indem das manuelle Angebot durch nur einen to_jsonAnruf ersetzt wird : ('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::json. Doppelte Anführungszeichen werden offerbeim Verketten automatisch um den Wert hinzugefügt .
jpmc26

0

Verwenden Sie insteade von json_object_agg => json_agg

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

1
Willkommen beim StackExchange. Fügen Sie zum besseren Verständnis einige Anmerkungen zur Abfrage hinzu.
Md Haidar Ali Khan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.