2012-08-01 9 views
9

Mam następujące dane:Wybieranie danych do tablicy Postgres

name   id    url 

John   1    someurl.com 
Matt   2    cool.com 
Sam   3    stackoverflow.com 

Jak mogę napisać instrukcję SQL w PostgreSQL, aby wybrać te dane do wielowymiarowej tablicy, a mianowicie:

{{John, 1, someurl.com}, {Matt, 2, cool.com}, {Sam, 3, stackoverflow.com}} 

Widziałem tego rodzaju wykorzystanie tablicy wcześniej w PostgreSQL, ale nie mam pojęcia, jak wybrać dane z tabeli do tego formatu tablicy.

Zakładając, że wszystkie kolumny są typu text.

Odpowiedz

21

Nie można używać array_agg() do produkcji tablic wielowymiarowych, przynajmniej nie do PostgreSQL 9.4.
(Ale nadchodząca Postgres 9.5 statki new variant of array_agg() że można!)

Co masz z @Matt Ball's query jest tablicę rekordów (the_table[]).

Tablica może zawierać tylko elementy tego samego typu podstawowego. Oczywiście masz numery i typy ciągów. Konwertuj wszystkie kolumny (które nie są jeszcze) na text, aby działało.

Możesz utworzyć funkcję agregującą dla tego, co już wcześniej zademonstrowałem przed Tobą here.

CREATE AGGREGATE array_agg_mult (anyarray) (
    SFUNC  = array_cat 
    ,STYPE  = anyarray 
    ,INITCOND = '{}' 
); 

połączeniami:

SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr 
FROM tbl; 

Informacja dodatkowa warstwa ARRAY[] aby wielowymiarową macierz (2-dimenstional, ściślej).

Instant 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; 
+0

Niesamowite! Dziękuję bardzo! –

+1

Cóż, mój przyjacielu, jesteś tak zwanym "deus ex machina" !!! – kostia

8

Należy użyć numeru aggregate function; array_agg powinien zrobić to, czego potrzebujesz.

SELECT array_agg(s) FROM (SELECT name, id, url FROM the_table ORDER BY id) AS s; 
+1

Ta odpowiedź zwraca tablicę rekordów, a nie wielowymiarowe tablicy. –

+0

Tak - właśnie pracowaliśmy w kontekście i masz rację ... Naprawdę potrzebuję wielowymiarowej tablicy! –

+1

@MattW: Myślę, że możesz pomóc. :) Wysłałem odpowiedź. –

Powiązane problemy