加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL中有两个数组的zip()函数有什么区别吗?

发布时间:2020-12-13 16:29:24 所属栏目:百科 来源:网络整理
导读:在PostgreSQL中我有两个相同长度的数组值: {a,b,c}和{d,e,f} 我想把它们结合起来 {{A,D},{B,E},{C,F}} 有办法吗? Postgres 9.3以上 简单的拉链() 请考虑Postgres 9.3或更早版本的以下演示: SELECT ARRAY[a,b] AS abFROM ( SELECT unnest('{a,c}'::text[])
在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()到多维数组:

现在,如果要将新的数组集合到一个二维数组中,则会变得更加复杂.

  
   
  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

array_agg(array expression)

060016

这是我在C中实现的自定义聚合函数array_agg_mult()的替代,这显着更快.用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读