2012-08-01 83 views
9

,我有以下數據:選擇數據到Postgres的陣列

name   id    url 

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

我怎麼能寫在Postgres的SQL語句來選擇這個數據到一個多維數組,即:

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

我以前在Postgres中見過這種數組用法,但不知道如何從表中選擇數據到這種數組格式。

這裏假設所有列都是text類型。

回答

21

不能使用array_agg()產生多維數組,至少達不到的PostgreSQL 9.4。
(但即將到來的的Postgres 9.5new variant of array_agg()可以!)

什麼你走出@Matt Ball's query是一組記錄(the_table[])。

數組只能容納相同基本類型的元素。你顯然有數字和字符串類型。將所有列(尚未)轉換爲text以使其工作。

您可以爲此創建一個聚合函數,就像我之前向您演示的here一樣。

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

呼叫:

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

注意附加ARRAY[]層,使之成爲多維數組(2- dimenstional,要準確)。

即時演示:

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

令人驚歎!非常感謝! – 2012-08-01 16:15:33

+1

以及我的朋友,你是所謂的「deus ex machina」! – kostia 2014-03-23 09:55:06

8

您需要使用aggregate function; array_agg應該做你需要的。

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

這個答案返回記錄的數組,而不是一個多維數組。 – 2012-08-01 15:52:04

+0

是的 - 剛剛在上下文中工作,你是對的......我真的需要多維數組! – 2012-08-01 16:01:55

+1

@MattW:我認爲你可以得到幫助。 :)發表了一個答案。 – 2012-08-01 16:07:43