介绍 PostgreSQL STRING_AGG() 和 ARRAY_AGG()函数

杜曜灿
2023-12-01

本文学习如何使用介绍 PostgreSQL STRING_AGG 函数,使用分割连接多个字符串。

1. 介绍PostgreSQL STRING_AGG()

PostgreSQL STRING_AGG() 函数是聚集函数,使用分隔符连接一组字符串,但结尾不会多余分隔符。语法如下:

STRING_AGG ( expression, separator [order_by_clause] )
  • expression 可以解析成字符串的任何有效表达式。如果是其他数据类型,需要显示转换为字符串。

  • separator 指定连接字符串的分隔符。

order_by_clause 子句是可选子句,用于指定连接字符串的顺序。语法形式如下:

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

STRING_AGG()函数类似与ARRAY_AGG()函数,除了返回值不同。前者返回字符串,后者返回array类型。和其他聚集函数AVG(), COUNT(), MAX(), MIN(), SUM()一样,STRING_AGG()函数通常也和group by子句一起使用。

2. PostgreSQL STRING_AGG()示例

对于电影示例数据库中的三个表 film, film_actor, actor ,即电影、演员以及电影和演员的关联表。

这里使用STRING_AGG()返回每部电影的演员列表:

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;

3. ARRAY_AGG()函数

前面已提及两者之间的差异,我们看语法:

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

接收一个表达式,可以返回任何类型可作为数组元素的值。order by子句是可选的,用于指定聚集中处理行的顺序,其决定返回结果数组的顺序,通常也和group by一起使用。还使用前面的示例数据库:

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;

与前面的差异是返回数组。需要指定顺序可以使用order by指定顺序:

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;

4. 总结

本文介绍了PostgreSQL STRING_AGG()函数和ARRAY_AGG()函数。前者用于使用指定的分隔符连接多个字符串,类似于MySQL的 GROUP_CONCAT函数。

 类似资料: