Реализация json_object_agg () в Postgres 9.3


9

Я чувствую, что мне нужна json_object_agg()функция Postgres 9.4, но я не смогу перейти с 9.3 прямо сейчас. Есть ли способ сделать то, что я хочу в 9.3? Вот мой сценарий. У меня есть таблица click_activityданных, которая выглядит как

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

Но я хочу превратить это в это: (агрегировать активность на пользователя)

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

Я думаю, что json_object_agg()функция Postgres 9.4 сделала бы это отлично, все, что мне нужно было бы вызвать

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

Есть ли способ сделать это в 9.3? Спасибо!


1
Это может быть относительно легко извлечь функцию и обернуть ее в расширение C ...
Крейг Рингер

Вы можете использовать pl / v8?
Клеман Прево

Ответы:


9

Я был в состоянии эмулировать json_object_agg, используя string_agg (который доступен в 9.3).

Ваш пример будет:

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

Это не будет выполнять побеги должным образом. Если значения содержат кавычки или другие символы со специальным значением в JSON, это приведет к ошибке или к неверному результату.
jpmc26

Это может быть исправлено заменять руководство квотирования только с to_jsonвызовом: ('{' || string_agg(to_json(offer) || ': ' || to_json(clicks), ',') || '}')::json. Двойные кавычки автоматически добавляются вокруг offerзначения при его объединении.
jpmc26

0

Используйте вместо json_object_agg => json_agg

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

1
Добро пожаловать в StackExchange. Пожалуйста, добавьте некоторые примечания, связанные с запросом, для лучшего понимания.
Г-н Хайдар Али Хан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.