本文学习如何使用介绍 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
子句一起使用。
对于电影示例数据库中的三个表 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;
前面已提及两者之间的差异,我们看语法:
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;
本文介绍了PostgreSQL STRING_AGG()函数和ARRAY_AGG()函数。前者用于使用指定的分隔符连接多个字符串,类似于MySQL的 GROUP_CONCAT函数。