2011-07-10 81 views
4

我有一個表,看起來像:PostgreSQL的:選擇陣列

id | t 
----+------- 
    1 | {1,2} 
    2 | {5,2} 
    3 | {6,2} 
    4 | {1,7} 
    5 | {1,8} 
    6 | {1,9} 

我正在尋找一個SELECT查詢將返回我的t陣列像{{1,2}, {5,2}, ... {1,9}}

假如t沒有一個數組數據類型,這本來是很容易,如:

SELECT ARRAY (SELECT t from tbl_foo); 

如果數據類型是int[]同樣可以做什麼?

+0

我添加了第二個基於自定義聚合的解決方案,我認爲它比純粹的函數更好。 –

回答

4

我不知道是否有一些簡單的方法(我希望如此),但這個工程(PostgreSQL沒有數組的數組,所以array_agg形式給出不在這裏工作了):

CREATE OR REPLACE FUNCTION func() 
RETURNS int[] AS $$ 
DECLARE 
    arr int[]; 
    res int[]; 
    n int; 
BEGIN 
    res := '{{0, 0}}'; 
    FOR arr IN SELECT t FROM tbl_foo 
    LOOP 
     res := res || arr; 
    END LOOP; 
    n := array_length(res, 1); 
    RETURN res[2:n]; 
END $$ 
LANGUAGE 'plpgsql'; 

例子:

CREATE TABLE tbl_foo (id serial, t int[]); 
INSERT INTO tbl_foo (t) VALUES 
    ('{1, 2}'), 
    ('{5, 2}'), 
    ('{6, 2}'), 
    ('{1, 7}'), 
    ('{1, 8}'), 
    ('{1, 9}'); 

SELECT func(); 
       func     
--------------------------------------- 
{{1,2},{5,2},{6,2},{1,7},{1,8},{1,9}} 
(1 row) 

編輯:

第二種解決方案是基於新的聚集函數,稱爲讓我們說array2_agg

CREATE OR REPLACE FUNCTION array2_agg_cutFirst(res anyarray) 
RETURNS anyarray AS $$ 
BEGIN 
    RETURN res[2:array_length(res, 1)]; 
END $$ 
LANGUAGE 'plpgsql'; 

CREATE AGGREGATE array2_agg(anyarray) 
(
    SFUNC = array_cat, 
    STYPE = anyarray, 
    FINALFUNC = array2_agg_cutFirst, 
    INITCOND = '{{0, 0}}' 
); 

SELECT array2_agg(t) FROM tbl_foo; 
       array2_agg 
--------------------------------------- 
{{1,2},{5,2},{6,2},{1,7},{1,8},{1,9}} 
(1 row) 

我需要array2_agg_cutFirst功能(簡單地切割第一'{0, 0}'子陣列),因爲INITCOND = '{{}}'是不允許的。

+0

感謝Grzegorz Szpetkowski。你太棒了 :) – Mayank