PostgreSQL中有两个数组的zip()函数有什么区别吗?
在PostgreSQL中我有两个相同长度的数组值:
{a,b,c}和{d,e,f} 我想把它们结合起来 {{A,D},{B,E},{C,F}} 有办法吗?
Postgres 9.3以上
简单的拉链() 请考虑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()到多维数组: 现在,如果要将新的数组集合到一个二维数组中,则会变得更加复杂.
要么:
要么:
将导致相同的错误消息(使用第9.1.5节进行测试):
但是,我们在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):
使用这个更干净和更简单的变体: SELECT ARRAY[a,b] AS ab FROM unnest('{a,f}'::text[]) x(a,b); Postgres 9.5 船
这是我在C中实现的自定义聚合函数array_agg_mult()的替代,这显着更快.用它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |