当前位置:  开发笔记 > 编程语言 > 正文

使用PostgreSQL上的SQL连接数组中的多个行

如何解决《使用PostgreSQL上的SQL连接数组中的多个行》经验,为你挑选了2个好方法。

我有一个像这样构造的表:

oid | identifier | value
1   | 10         | 101
2   | 10         | 102
3   | 20         | 201
4   | 20         | 202
5   | 20         | 203

我想查询此表以获得如下结果:

identifier | values[]
10         | {101, 102}
20         | {201, 202, 203}

我无法想办法做到这一点.那可能吗 ?怎么样 ?

非常感谢你.



1> peufeu..:

这是一个Postgres内置的几个版本,所以你不再需要定义自己的,名称是array_agg().

test=> select array_agg(n) from generate_series(1,10) n group by n%2;
  array_agg   
--------------
 {1,3,5,7,9}
 {2,4,6,8,10}

(这是Postgres 8.4.8).

请注意,未ORDER BY指定,因此结果行的顺序取决于所使用的分组方法(此处为散列),即未定义.例:

test=> select n%2, array_agg(n) from generate_series(1,10) n group by (n%2);
 ?column? |  array_agg   
----------+--------------
        1 | {1,3,5,7,9}
        0 | {2,4,6,8,10}

test=> select (n%2)::TEXT, array_agg(n) from generate_series(1,10) n group by (n%2)::TEXT;
 text |  array_agg   
------+--------------
 0    | {2,4,6,8,10}
 1    | {1,3,5,7,9}

现在,我不知道为什么你{10,2,4,6,8}{9,7,3,1,5}的,因为generate_series()应该按顺序发送行.



2> Johannes Wei..:

你必须创建一个聚合函数,例如

CREATE AGGREGATE array_accum (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);

然后

SELECT identifier, array_accum(value) AS values FROM table GROUP BY identifier;

HTH

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有