Menerapkan json_object_agg () di Postgres 9.3

9

Saya merasa saya membutuhkan json_object_agg()fungsi Postgres 9.4 tetapi saya tidak akan dapat memutakhirkan dari 9.3 sekarang. Apakah ada cara untuk melakukan apa yang saya inginkan di 9.3? Inilah skenario saya. Saya memiliki tabel click_activitydata yang terlihat seperti

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

Tapi saya ingin mengubahnya menjadi ini: (mengagregasi aktivitas per pengguna)

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

Saya pikir json_object_agg()fungsi Postgres 9.4 akan melakukan ini dengan sempurna, yang harus saya panggil adalah

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

Apakah ada cara untuk melakukan ini di 9.3? Terima kasih!

thomaskeefe
sumber
1
Mungkin relatif mudah untuk mengekstrak fungsi dan membungkusnya dalam ekstensi C ...
Craig Ringer
Bisakah Anda menggunakan pl / v8?
Clément Prévost

Jawaban:

9

Saya dapat meniru json_object_agg menggunakan string_agg (yang tersedia di 9.3).

Contoh Anda adalah:

select user, ('{' || string_agg('"' || offer || '": ' || clicks, ',') || '}')::json as activity 
from click_activity 
group by user
Bert Hartmann
sumber
Ini tidak akan melakukan lolos dengan benar. Jika nilai mengandung tanda kutip atau karakter lain dengan makna khusus di JSON, ini akan membuat kesalahan atau menghasilkan hasil yang salah.
jpmc26
Ini bisa diperbaiki be menggantikan manual mengutip hanya dengan to_jsonpanggilan: ('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::json. Kutipan ganda ditambahkan secara otomatis di sekitar offernilai ketika menggabungkannya.
jpmc26
0

Gunakan insteade dari json_object_agg => json_agg

select user, json_agg((offer, clicks)) from click_activity group by 1
sara GHOZALI
sumber
1
, Selamat datang di StackExchange. Mohon tambahkan beberapa catatan yang terkait dengan permintaan, untuk pemahaman yang lebih baik.
Md Haidar Ali Khan