Массивы площадок с NULL до максимальной длины для пользовательской функции агрегирования

Из ответа на вопросКак использовать array_agg () для varchar [],

Мы можем создать собственную функцию агрегирования для агрегирования n-мерных массивов в Postgres, например:

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = '{}'
);

Ограничением является то, что значения должны разделятьодинаковые экстенты массива и одинаковая длинаобработка пустых значений и разной длины не работает.

Из ответа:

Обойти это невозможно, тип массива не допускает такого несоответствия в Postgres. Вы можете дополнить массивы значениями NULL, чтобы все измерения имели совпадающие экстенты.

У меня такие строки как

------ arrayfield

-----  {1},
-----  {},
-----  {abc}

array_agg_mult(ARRAY[arrayfield]) AS customarray

Я ожидаю, что совокупный результат как{{1},NULL,{abc}}

но это бросит

ERROR:  cannot concatenate incompatible arrays
DETAIL:  Arrays with differing element dimensions are not compatible for concatenation.

Есть ли способ добавить значения отступов в пользовательскую функцию?

Я обнаружил, что проблема в том, когда массивдлина это отличается.{a},{null},{1} будет агрегировать, но{a,b},{},{1} не буду.

Поэтому мне нужен запрос, где я могу добавить NULL-элементы в существующие массивы.

Одним из решений является добавление двух NULL всегда (2 - максимальная длина, которая будет в этом поле)array_cat(arr, ARRAY[NULL,NULL]) и обрезать массив до длины 2:

   {1}   --> {1,NULL,NULL}     --> {1,NULL}
   {NULL}  --> {NULL,NULL,NULL}  --> {NULL,NULL}
   {abc, def}  --> {abc,def,NULL,NULL}  --> {abc, def} 

Но я не могу понять,синтаксис.

Ответы на вопрос(1)

Ваш ответ на вопрос