PostgreSQL 教程: string_agg 函数

八月 25, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的STRING_AGG()函数连接字符串并在它们之间放置分隔符。

PostgreSQL STRING_AGG() 函数介绍

PostgreSQL 的STRING_AGG()函数是一个聚合函数,它连接字符串列表并在它们之间放置分隔符。该函数不会在字符串末尾添加分隔符。

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

STRING_AGG ( expression, separator [order_by_clause] )

STRING_AGG()函数接受两个参数和一个可选的ORDER BY子句。

  • expression是可以解析为字符串的任何有效表达式。如果您使用字符串类型以外的其他类型,则需要将这些类型的值显式转换(cast)为字符串类型。
  • separator是连接字符串的分隔符。

order_by_clause是一个可选子句,指定连接结果的顺序。它具有以下形式:

ORDER BY expression1 {ASC | DESC}, [...]

除了返回类型之外,STRING_AGG()ARRAY_AGG()函数类似。STRING_AGG()函数的返回类型是字符串,而ARRAY_AGG()函数的返回类型是数组

与其他聚合函数(例如AVG()COUNT()MAX()MIN()SUM())一样,STRING_AGG()函数通常与GROUP BY子句一起使用。

PostgreSQL STRING_AGG() 函数示例

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

A) 使用 STRING_AGG() 函数生成逗号分隔的列表

此示例使用STRING_AGG()函数从film表中返回每部电影的演员姓名列表:

SELECT
    f.title,
    STRING_AGG (
	a.first_name || ' ' || a.last_name,
        ','
       ORDER BY
        a.first_name,
        a.last_name
    ) actors
FROM
    film f
INNER JOIN film_actor fa USING (film_id)
INNER JOIN actor a USING (actor_id)
GROUP BY
    f.title;

这是部分输出:

PostgreSQL STRING_AGG function comma-separated list example

B) 使用 STRING_AGG() 函数生成电子邮件列表

以下示例使用STRING_AGG()函数为每个国家/地区构建电子邮件列表。每个列表中的电子邮件以分号分隔。

SELECT
    country,
    STRING_AGG (email, ';') email_list
FROM
    customer
INNER JOIN address USING (address_id)
INNER JOIN city USING (city_id)
INNER JOIN country USING (country_id)
GROUP BY
    country
ORDER BY
    country;

下图是部分输出:

PostgreSQL STRING_AGG function email list example

在本教程中,您学习了如何使用 PostgreSQL 的STRING_AGG()函数连接字符串,并在它们之间放置分隔符。