De aangepaste aggregatiefunctie gebruiken array_agg_mult()
zoals gedefinieerd in dit gerelateerde antwoord:
Uw verwachte resultaat is onmogelijk:
{{1},NULL,{abc}}
Zou moeten zijn:
{{1},{NULL},{abc}}
Eenvoudig geval met 0 of 1 array-elementen
Voor het eenvoudige geval om gewoon de lege array te vervangen:U kunt dat bereiken met:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Dynamische opvulling voor n elementen
array_fill()
gebruiken om arrays met NULL-elementen op te vullen tot de maximale lengte:
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;
Werkt nog steeds alleen voor 1-dimensionaal basisarrays.
Uitleggen
- Subquery
t1
berekent de maximale lengte van de 1-dimensionale basisarray. COALESCE(array_length(arr, 1), 0)
berekent de lengte van de array in deze rij.COALESCE
standaard ingesteld op0
voorNULL
.- Genereer opvulmatrix voor het verschil in lengte met
array_fill()
. - Voeg dat toe aan
arr
met||
- Aggregeren zoals hierboven met
array_agg_mult()
.
SQL Fiddle.
alles laten zien .
Uitvoer in SQL Fiddle is misleidend, dus ik cast het resultaat daar naar de tekst.