Non puoi usare array_agg()
per produrre array multidimensionali, almeno non fino a PostgreSQL 9.4.
(Ma il prossimo Postgres 9.5 spedisce una nuova variante di array_agg()
che può!)
Quello che ottieni dalla query di @Matt Ball è un array di record (the_table[]
).
Un array può contenere solo elementi dello stesso tipo di base. Ovviamente hai tipi di numeri e stringhe. Converti tutte le colonne (che non lo sono già) in text
per farlo funzionare.
Puoi creare una funzione aggregata per questo come ti ho mostrato prima qui.
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Chiama:
SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr
FROM tbl;
Nota l'ulteriore ARRAY[]
livello per renderlo un array multidimensionale (2-dimensionale, per essere precisi).
Demo istantanea:
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;