Você não pode usar
array_agg()
para produzir arrays multidimensionais, pelo menos não até o PostgreSQL 9.4.(Mas o próximo Postgres 9.5 envia uma nova variante de
array_agg()
que pode!) O que você obtém da consulta do @Matt Ball é uma matriz de registros (
the_table[]
). Uma matriz só pode conter elementos do mesmo tipo base. Você obviamente tem tipos de número e string. Converta todas as colunas (que ainda não são) para
text
para fazê-lo funcionar. Você pode criar uma função agregada para isso como eu demonstrei aqui antes.
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Ligar:
SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr
FROM tbl;
Observe o
ARRAY[]
adicional camada para torná-lo um array multidimensional (2-dimensional, para ser preciso). Demonstração instantânea:
WITH tbl(id, txt) AS (
VALUES
(1::int, 'foo'::text)
,(2, 'bar')
,(3, '}b",') -- txt has meta-characters
)
, x AS (
SELECT array_agg_mult(ARRAY[ARRAY[id::text,txt]]) AS t
FROM tbl
)
SELECT *, t[1][3] AS arr_element_1_1, t[3][4] AS arr_element_3_2
FROM x;