Postgres 9.3以上
原文链接:https://www.f2er.com/postgresql/192744.html简单的拉链()
请考虑Postgres 9.3或更早版本的以下演示:
SELECT ARRAY[a,b] AS ab FROM ( SELECT unnest('{a,c}'::text[]) AS a,unnest('{d,f}'::text[]) AS b ) x;
结果:
ab ------- {a,d} {b,e} {c,f}
请注意,两个数组必须具有相同数量的元素到不及时的并行,或者您得到一个交叉连接.
你可以把它包装成一个函数,如果你想:
CREATE OR REPLACE FUNCTION zip(anyarray,anyarray) RETURNS SETOF anyarray LANGUAGE sql AS $func$ SELECT ARRAY[a,b] FROM (SELECT unnest($1) AS a,unnest($2) AS b) x; $func$;
呼叫:
SELECT zip('{a,c}'::text[],'{d,f}'::text[]);
相同的结果.
zip()到多维数组:
现在,如果要将新的数组集合到一个二维数组中,则会变得更加复杂.
SELECT ARRAY (SELECT ...)
要么:
SELECT array_agg(ARRAY[a,b]) AS ab FROM ( SELECT unnest('{a,f}'::text[]) AS b ) x
要么:
SELECT array_agg(ARRAY[ARRAY[a,b]]) AS ab FROM ...
将导致相同的错误消息(使用第9.1.5节进行测试):
ERROR: could not find array type for data type text[]
但是,我们在this closely related question年之前就有了一个办法.
创建自定义聚合函数:
CREATE AGGREGATE array_agg_mult (anyarray) ( SFUNC = array_cat,STYPE = anyarray,INITCOND = '{}' );
并使用它:
SELECT array_agg_mult(ARRAY[ARRAY[a,b]]) AS ab FROM ( SELECT unnest('{a,f}'::text[]) AS b ) x
结果:
{{a,d},{b,e},{c,f}}
注意附加的ARRAY []图层!没有它,只是:
SELECT array_agg_mult(ARRAY[a,b]) AS ab FROM ...
你得到:
{a,d,c,f}
哪些可能用于其他目的.
卷另一个功能:
CREATE OR REPLACE FUNCTION zip2(anyarray,anyarray) RETURNS SETOF anyarray LANGUAGE sql AS $func$ SELECT array_agg_mult(ARRAY[ARRAY[a,b]]) FROM (SELECT unnest($1) AS a,unnest($2) AS b) x; $func$;
呼叫:
SELECT zip2('{a,f}'::text[]); -- or any other array type
结果:
{{a,f}}
Postgres 9.4
使用ROWS FROM构造或更新的unnest(),它将多个数组并行并行排列.每个都可以有不同的长度.你得到(per documentation):
[…] the number of result rows in this case is that of the largest function
result,with smaller results padded with null values to match.
使用这个更干净和更简单的变体:
SELECT ARRAY[a,b] AS ab FROM unnest('{a,f}'::text[]) x(a,b);
Postgres 9.5
060016