PostgreSQL 教程: array_agg 函数

八月 25, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的ARRAY_AGG()聚合函数从一组输入值返回一个数组。

PostgreSQL ARRAY_AGG() 函数介绍

PostgreSQL 的ARRAY_AGG()函数是一个聚合函数,它接受一组值并返回一个数组,其中每个值都被分配到数组中的一个元素。

下面显示了ARRAY_AGG()函数的语法:

ARRAY_AGG(expression [ORDER BY [sort_expression {ASC | DESC}], [...])

ARRAY_AGG()接受一个表达式,该表达式返回对于数组元素有效的任何类型的值。

ORDER BY子句是可选子句。它指定聚合过程中处理的行的顺序,这决定了结果数组中元素的顺序。

与其他聚合函数(例如AVG()COUNT()MAX()MIN()SUM())类似,ARRAY_AGG()经常与GROUP BY子句一起使用。

PostgreSQL ARRAY_AGG() 函数示例

我们将使用示例数据库中的filmfilm_actoractor表进行演示。

不带 ORDER BY 子句的 ARRAY_AGG() 函数使用示例

以下示例使用ARRAY_AGG()函数返回电影标题列表和每部电影的演员列表:

SELECT
    title,
    ARRAY_AGG (first_name || ' ' || last_name) actors
FROM
    film
INNER JOIN film_actor USING (film_id)
INNER JOIN actor USING (actor_id)
GROUP BY
    title
ORDER BY
    title;

这是部分输出:

img

正如你所看到的,每部电影中的演员都是任意排列的。要按姓氏或名字对演员进行排序,您可以在ARRAY_AGG()函数中使用ORDER BY子句。

带 ORDER BY 子句的 ARRAY_AGG() 函数使用示例

此示例使用ARRAY_AGG()函数返回电影列表以及每部电影的演员列表(按演员的名字排序):

SELECT
    title,
    ARRAY_AGG (
        first_name || ' ' || last_name
        ORDER BY
            first_name
    ) actors
FROM
    film
INNER JOIN film_actor USING (film_id)
INNER JOIN actor USING (actor_id)
GROUP BY
    title
ORDER BY
    title;

下面显示了部分输出:

img

您可以按演员的名字和姓氏对每部电影的演员列表进行排序,如以下查询所示:

SELECT
    title,
    ARRAY_AGG (
        first_name || ' ' || last_name
        ORDER BY
            first_name ASC,
            last_name DESC
    ) actors
FROM
    film
INNER JOIN film_actor USING (film_id)
INNER JOIN actor USING (actor_id)
GROUP BY
    title
ORDER BY
    title;

下图显示了查询的部分输出:

img

在本教程中,您学习了如何使用 PostgreSQL 的ARRAY_AGG()函数从一组输入值返回一个数组。