Nie możesz użyć array_agg()
do tworzenia tablic wielowymiarowych, przynajmniej nie do PostgreSQL 9.4.
(Ale nadchodzący Postgres 9.5 dostarcza nowy wariant array_agg()
to może!)
To, co otrzymujesz z zapytania @Matt Ball, to tablica rekordów (the_table[]
).
Tablica może zawierać tylko elementy tego samego typu podstawowego. Oczywiście masz typy liczbowe i łańcuchowe. Konwertuj wszystkie kolumny (które jeszcze nie są) na text
aby to działało.
Możesz do tego utworzyć funkcję agregującą, tak jak ci już to zademonstrowałem.
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
Zadzwoń:
SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr
FROM tbl;
Zwróć uwagę na dodatkowy ARRAY[]
warstwy, aby uczynić ją wielowymiarową tablicą (ściślej dwuwymiarową).
Natychmiastowe demo:
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;