2017-10-20 14 views
2

En utilisant Postgres 9.5, je veux concaterner des tableaux d'entiers à partir d'un GROUP BY. De la documentation est semble que array_agg devrait être en mesure de le faire, mais je reçois: ERROR: cannot accumulate arrays of different dimensionalityPostgreSQL array_agg (INTEGER [])

En utilisant array_dims sur mon ensemble de test, j'obtiens [1:18], [1:24] et [1:48]. Je vois cela comme 3 tableaux de 1 dimension de différentes longueurs. Le résultat devrait être un seul tableau avec une dimension [1:90] Qu'est-ce qui me manque ici?

+0

IIRC array_agg est utilisé pour concaténer les valeurs regroupées en un seul tableau, ne pas concaténer des tableaux. – Magisch

+0

array_agg agrège les lignes en tableau - par exemple 'select array_agg (oid) from pg_database' –

+0

array_agg tente de faire ceci: array [tableau [1:18], tableau [1:24], tableau [1:48]]' et ce n'est pas un tableau multidimensionnel valide. Vous devez écrire votre propre agrégat qui contiendra des tableaux à la place. –

Répondre

3

Suite de la discussion dans les commentaires, ma suggestion personnelle est de créer un agrégat.

CREATE AGGREGATE array_concat_agg(anyarray) (
    SFUNC = array_cat, 
    STYPE = anyarray 
); 

Ensuite, vous pouvez le faire:

SELECT column1 
    FROM (VALUES (array[1,2,3]), (array[3,4]), (array[53,43,33,22])) arr; 
    column1 
--------------- 
{1,2,3} 
{3,4} 
{53,43,33,22} 
(3 rows) 

SELECT array_concat_agg(column1) 
    FROM (VALUES (array[1,2,3]), (array[3,4]), (array[53,43,33,22])) arr; 
    array_concat_agg 
------------------------- 
{1,2,3,3,4,53,43,33,22} 
(1 row) 
+0

Merci, c'est tellement simple que je me demande pourquoi ce n'est pas une fonction standard. – Derek