【问题标题】:Vertical to Horizontal?垂直到水平?
【发布时间】:2010-09-30 17:16:46
【问题描述】:

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

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

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

因此,我希望排列 [many] 行的单列结果集。如果我可以调用像 arrayify(SELECT column2 FROM table WHERE column1 = 'A') 这样的函数,那会让我的生活变得如此轻松。

有人知道吗?

谢谢

【问题讨论】:

    标签: sql arrays postgresql rdbms


    【解决方案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 聚合或类似的工作。这是一种写“as_array”的方法:

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

    【讨论】: