Използване на персонализираната агрегатна функция array_agg_mult()
както е дефинирано в този свързан отговор:
Вашият очакван резултат е невъзможен:
{{1},NULL,{abc}}
Трябва да бъде:
{{1},{NULL},{abc}}
Прост случай с 0 или 1 елемент на масив
За простия случай просто да замените празния масив:Можете да постигнете това с:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Динамично подпълване за n елемента
Използване на array_fill()
за допълване на масиви с NULL елементи до максималната дължина:
SELECT array_agg_mult(ARRAY[
arr || array_fill(NULL::text
, ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
]) AS result
FROM t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;
Все още работи само за 1-измерен основни масиви.
Обяснете
- Подзаявка
t1
изчислява максималната дължина на основния 1-измерен масив. COALESCE(array_length(arr, 1), 0)
изчислява дължината на масива в този ред.COALESCE
по подразбиране е0
заNULL
.- Генериране на масив за допълване за разликата в дължината с
array_fill()
. - Добавете това към
arr
с||
- Агрегирайте както по-горе с
array_agg_mult()
.
SQL Fiddle.
демонстриравсички .
Изходът в SQL Fiddle е подвеждащ, така че прехвърлих резултата към текст там.