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()函数从一组输入值返回一个数组。

了解更多

PostgreSQL 教程:聚合函数

PostgreSQL 文档:聚集函数