Triển khai json_object_agg () trong Postgres 9.3


9

Tôi cảm thấy mình cần json_object_agg()chức năng của Postgres 9.4 nhưng tôi sẽ không thể nâng cấp từ 9.3 ngay bây giờ. Có cách nào để làm những gì tôi muốn trong 9.3 không? Đây là kịch bản của tôi. Tôi có một bảng click_activitydữ liệu trông giống như

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

Nhưng tôi muốn biến nó thành thế này: (tổng hợp hoạt động cho mỗi người dùng)

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

Tôi nghĩ rằng json_object_agg()chức năng của Postgres 9.4 sẽ làm điều này một cách hoàn hảo, tất cả những gì tôi phải gọi là

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

Có cách nào để làm điều này trong 9.3 không? Cảm ơn bạn!


1
Có thể tương đối dễ dàng để trích xuất chức năng và gói nó trong một phần mở rộng C ...
Craig Ringer

Bạn có thể sử dụng pl / v8 không?
Clément Prévost

Câu trả lời:


9

Tôi đã có thể mô phỏng json_object_agg bằng chuỗi_agg (có sẵn trong 9.3).

Ví dụ của bạn sẽ là:

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

Điều này sẽ không thực hiện thoát đúng. Nếu các giá trị chứa dấu ngoặc kép hoặc các ký tự khác có ý nghĩa đặc biệt trong JSON, điều này sẽ gây ra lỗi hoặc tạo ra kết quả không chính xác.
jpmc26

Điều này có thể được sửa chữa bằng cách thay thế trích dẫn thủ công chỉ bằng một to_jsoncuộc gọi : ('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::json. Dấu ngoặc kép được thêm tự động xung quanh offergiá trị khi nối nó.
jpmc26

0

Sử dụng thay thế của json_object_agg => json_agg

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

1
, Chào mừng bạn đến với StackExchange. Vui lòng thêm một số ghi chú liên quan đến truy vấn, để hiểu rõ hơn.
Md Haidar Ali Khan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.