Skip to main content
 首页 » 数据库

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

2022年07月19日126sky-heaven

本文学习如何使用介绍 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函数。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/111453526
阅读延展