json_agg и json_build_object в Redshift

#amazon-redshift #aggregate-functions

#amazon-redshift #агрегатные функции

Вопрос:

Я предпочитаю агрегировать результаты подзапроса в виде массива JSON в PostgreSQL.

Это пример.

 SELECT
  a.name,
  (
    SELECT json_agg(json_build_object('col1', b.col1)) AS data
    FROM table_b AS b WHERE b.year = a.year
  ) AS data
FROM
  table_a AS a
  

Как я могу сделать то же самое в Redshift?

Ответ №1:

Как я полагаю, вы знаете, redshift основан на Postgres 8 и не имеет этих функций. Я могу придумать 2 способа, которыми вы можете продолжить. 1) напишите приложение на python для подключения к Redshift изначально и используйте библиотеки python для создания желаемого вывода JSON. Это может быть правильным путем, если JSON являются сложными и / или если считыватель JSON является некоторой автоматизацией. Вы должны быть в состоянии создать хранимую процедуру из этого python. Или 2) используйте list_agg() для генерации искомой строки JSON. Этот маршрут довольно прост и должен работать нормально для простых конструкций JSON. Вы также можете запрограммировать это в хранимой процедуре, если хотите.

# 2 выглядит примерно так (непроверено):

 SELECT '[' || list_agg('{"col1": "' || col1 || '"}', ', ') || ']' FROM ...