Массивы площадок с 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}
Но я не могу понять,синтаксис.