【问题标题】:PostgresQL SQL: Converting results to arrayPostgresQL SQL:将结果转换为数组
【发布时间】:2011-08-09 02:14:08
【问题描述】:

下面的查询:

    SELECT  i_adgroup_id, i_category_id
    FROM adgroupcategories_br
    WHERE i_adgroup_id IN
    (
        SELECT i_adgroup_id
        FROM adgroupusers_br
        WHERE i_user_id = 103713
    )
    GROUP BY i_adgroup_id, i_category_id;

给我这样的结果:

    i_adgroup_id integer | i_category_id smallint
    ---------------------|-----------------------
    15938                | 2
    15938                | 3
    15938                | 4
    15942                | 1
    15942                | 2

我想要的是这样的结果:

    i_adgroup_id integer | i_category_id smallint[]
    ---------------------|-----------------------
    15938                | { 2, 3, 4 }
    15942                | { 1, 2 }

如何更改原始 SQL 查询以提供上述结果?

【问题讨论】:

    标签: sql arrays postgresql


    【解决方案1】:

    您想使用array_agg,这应该可以:

    SELECT i_adgroup_id, array_agg(i_category_id)
    FROM adgroupcategories_br
    WHERE i_adgroup_id IN
    (
        SELECT i_adgroup_id
        FROM adgroupusers_br
        WHERE i_user_id = 103713
    )
    GROUP BY i_adgroup_id;
    

    请注意,i_category_id 不再包含在 GROUP BY 中,因为它现在正在被聚合。

    【讨论】:

    • 感谢您的回答。我们可以将多列传递给 array_agg 或任何其他聚合函数吗?我想用 jsonb_object_agg() 在同一输出列中输出多个键:值对
    • @Ulvi 您可以array_agg(array[c1, c2]) 构建数组数组或使用派生表 (select jsonb_object_agg(k, v) from (select k, array_agg(array[c1, c2]) v from ...) dt)。或者现有的 JSON 函数可能无需额外步骤即可完成。取决于你具体想生产什么。
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 2015-01-07
    • 1970-01-01
    • 2020-08-25
    • 2018-06-26
    • 2015-09-14
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多