Implementazione di json_object_agg () in Postgres 9.3


9

Mi sento come se avessi bisogno della json_object_agg()funzione di Postgres 9.4 ma non sarò in grado di aggiornare da 9.3 in questo momento. C'è un modo per fare quello che voglio in 9.3? Ecco il mio scenario. Ho una tabella click_activitydi dati che sembra

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

Ma voglio trasformarlo in questo: (aggregare l'attività per utente)

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

Penso che la json_object_agg()funzione di Postgres 9.4 lo farebbe perfettamente, tutto ciò che dovrei chiamare è

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

C'è un modo per farlo in 9.3? Grazie!


1
Potrebbe essere relativamente facile estrarre la funzione e racchiuderla in un'estensione C ...
Craig Ringer,

Puoi usare pl / v8?
Clément Prévost,

Risposte:


9

Sono stato in grado di emulare json_object_agg usando string_agg (che è disponibile in 9.3).

Il tuo esempio sarebbe:

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

Questo non eseguirà correttamente le fughe. Se i valori contengono virgolette o altri caratteri con significati speciali in JSON, ciò genererà un errore o genererà un risultato errato.
jpmc26,

Questo può essere risolto sostituirà il manuale di citazione con solo una to_jsonchiamata: ('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::json. Le virgolette doppie vengono aggiunte automaticamente attorno al offervalore quando lo si concatena.
jpmc26,

0

Usa invece di json_object_agg => json_agg

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

1
, Benvenuto in StackExchange. Si prega di aggiungere alcune note relative alla query, per una migliore comprensione.
Md Haidar Ali Khan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.