Implementando json_object_agg () en Postgres 9.3

9

Siento que necesito la json_object_agg()función de Postgres 9.4 pero no podré actualizar desde 9.3 en este momento. ¿Hay alguna manera de hacer lo que quiero en 9.3? Aquí está mi escenario. Tengo una tabla click_activityde datos que se parece a

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

Pero quiero convertirlo en esto: (agregue la actividad por usuario)

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

Creo que la json_object_agg()función de Postgres 9.4 haría esto perfectamente, todo lo que tendría que llamar es

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

¿Hay alguna manera de hacer esto en 9.3? ¡Gracias!

Thomaskeefe
fuente
1
Puede ser relativamente fácil extraer la función y envolverla en una extensión C ...
Craig Ringer
¿Se puede usar pl / v8?
Clément Prévost

Respuestas:

9

Pude emular json_object_agg usando string_agg (que está disponible en 9.3).

Tu ejemplo sería:

select user, ('{' || string_agg('"' || offer || '": ' || clicks, ',') || '}')::json as activity 
from click_activity 
group by user
Bert Hartmann
fuente
Esto no realizará escapes correctamente. Si los valores contienen comillas u otros caracteres con significados especiales en JSON, esto arrojará un error o generará un resultado incorrecto.
jpmc26
Esto se puede solucionar a sustituir el manual citando con sólo una to_jsonllamada: ('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::json. Las comillas dobles se agregan automáticamente alrededor del offervalor al concatenarlo.
jpmc26
0

Use insteade de json_object_agg => json_agg

select user, json_agg((offer, clicks)) from click_activity group by 1
sara GHOZALI
fuente
1
, Bienvenido a StackExchange. Agregue amablemente algunas notas relacionadas con la consulta, para una mejor comprensión.
Md Haidar Ali Khan