如何合併/合併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
如何合併/合併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
這聽起來像你需要一個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}}
感謝您對這個大而詳細的解答! –