垂直到水平?

时间:2009-01-10 22:29:39

标签: sql arrays postgresql rdbms

我有一个PostgreSQL表,如下所示:

A -> B
A -> C
A -> G
A -> H
B -> O
B -> K

“ - >”分隔两列,其中第一列指向第二列(超链接)。现在我想在第一列中获取所有不同的值,并为它们分配一个包含它们在第二列中指向的所有值的ARRAY,从而减少索引大小并帮助我更接近我希望得到的位置。

因此,我希望ARRAYify [多]行的单个圆柱结果集。如果我可以调用像arrayify(SELECT column2 FROM table WHERE column1 = 'A'这样的函数来使我的生活如此轻松。

任何人或任何人都知道吗?

Thx

1 个答案:

答案 0 :(得分:1)

这取决于您使用的PostgreSQL版本。如果您使用的是最新版本(目前支持的任何版本),则可以使用array_agg(col)

例如:

select array_agg(test) from test;
                                       array_agg                                

--------------------------------------------------------------------------------
-------
 {4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
32,33}
(1 row)

如果您使用的是旧版本,则可能需要编写自己的array_agg聚合或workalike。这是一种编写名为“as_array”的方法:

CREATE AGGREGATE as_array (
        BASETYPE = ANYELEMENT,
        STYPE = ANYARRAY,
        SFUNC = ARRAY_APPEND,
        INITCOND = '{}'
);