2013-01-03 56 views
2

如何合併/合併pl/pgsql中的數組?pl/pgsql合併或組合陣列

比如我有一個3列:{1,2,3}{"a","b","c"},並{32,43,23}

合併後,我需要得到:

{{1,"a",32}, {2,"b",43}, {3,"c",23}} 

我的PostgreSQL的版本是9.0

回答

4

這聽起來像你需要一個n參數zip函數,如在一些功能語言和具有功能擴展的語言中找到的那樣。

在這種情況下,你不能完全按照你想要的,因爲這些數組是hetrogeneous類型。 PostgreSQL數組必須是同類型的,所以這是行不通的。你顯示的結果是一個無效的數組。

您可以創建一個ROW s(匿名記錄)數組,或將所有值轉換爲text

例如:

SELECT array_agg(ROW(a,b,c)) 
FROM (
    SELECT 
    unnest('{1,2,3}'::integer[]), 
    unnest('{"a","b","c"}'::text[]), 
    unnest('{32,43,23}'::integer[]) 
) 
x(a,b,c); 

會產生:

{"(1,a,32)","(2,b,43)","(3,c,23)"} 

這是投射到文本3個rowtypes陣列。由於Pg對匿名記錄的支持非常有限,因此與其合作會很尷尬;最重要的是在這種情況下,您不能將文本值轉換爲RECORD(integer,text,integer),您必須實際CREATE TYPE並轉換爲定義的類型。

由於這個限制,您可能想要將所有值轉換爲text並使用text的二維數組。你會希望能夠做一個簡單的array_agg,但令人沮喪的失敗:

SELECT array_agg(ARRAY[a::text,b,c::text]) 
FROM (
    SELECT 
    unnest('{1,2,3}'::integer[]), 
    unnest('{"a","b","c"}'::text[]), 
    unnest('{32,43,23}'::integer[]) 
) 
x(a,b,c); 

生產:

ERROR: could not find array type for data type text[] 

因爲array_agg不支持數組作爲輸入。您需要定義array_agg的另一個變體,該變體需要輸入text[]。我前一段時間寫過一篇,但現在找不到;我會嘗試找到它並更新,如果我找到它。與此同時,你可以解決它通過鑄造內部數組text

SELECT array_agg(ARRAY[a::text,b,c::text]::text) 
    FROM (
     SELECT 
     unnest('{1,2,3}'::integer[]), 
     unnest('{"a","b","c"}'::text[]), 
     unnest('{32,43,23}'::integer[]) 
    ) 
    x(a,b,c); 

產生輸出,如:

{"{1,a,32}","{2,b,43}","{3,c,23}"} 

... OK,我還沒有找到一個我寫的,但here's an example from Erwin that does the job fine。試試這個:

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

SELECT array_agg_mult(ARRAY[ARRAY[a::text,b,c::text]]) 
FROM (
    SELECT 
    unnest('{1,2,3}'::integer[]), 
    unnest('{"a","b","c"}'::text[]), 
    unnest('{32,43,23}'::integer[]) 
) 
x(a,b,c); 

輸出:

{{1,a,32},{2,b,43},{3,c,23}} 
+0

感謝您對這個大而詳細的解答! –