PostgreSQL string_agg() 函数使用指南

PostgreSQL string_agg() 函数是一个聚合函数,它返回一个包含了一个分组中的所有的指定的值组成的字符串。

string_agg() 语法

这里是 PostgreSQL string_agg() 的语法:

string_agg(expr, delimiter TEXT) -> TEXT

我们通常在 SQLite 中按如下方式使用 string_agg() 函数:

SELECT string_agg(expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];

参数

expr
必需的。一个列名或者表达式,其中的所有的值将被连接在一起。
delimiter
必需的。分隔符,分隔 expr 中的所有的值。

返回值

PostgreSQL string_agg() 函数返回一个字符串,它包含了指定的一个分组中的指定表达式或者列中的所有值,包括 null,其中多个值之间使用 delimiter 分隔。

string_agg() 示例

为了演示 PostgreSQL string_agg() 的用法,我们使用以下 UNIONSELECT 语句模拟一个表:

SELECT 'Tim' name, 'Football' hobby
UNION
SELECT 'Tim' name, 'Baseball' hobby
UNION
SELECT 'Tom' name, 'Piano' hobby
UNION
SELECT 'Tom' name, 'violin' hobby;
 name |  hobby
------+----------
 Tom  | violin
 Tom  | Piano
 Tim  | Football
 Tim  | Baseball
(4 rows)

这里,我们拥有了关于用户业余爱好的一些行。其中 name 列中是用户的姓名, hobby 列中是用户的一个业余爱好。

假如,要想以用户为单位(具有相同名称的用户视为一个用户),将每一个用户的所有业余爱好都放在一个字符串(通过逗号分隔)中,您可以使用 GROUP BY 子句按照 name 分组,并使用 string_agg() 函数将每组中 hobby 的值组成一个字符串。下面的语句实现了这个需求:

SELECT
    t.name,
    string_agg(t.hobby, ',') hobbies
FROM (
    SELECT 'Tim' name, 'Football' hobby
    UNION
    SELECT 'Tim' name, 'Baseball' hobby
    UNION
    SELECT 'Tom' name, 'Piano' hobby
    UNION
    SELECT 'Tom' name, 'violin' hobby
) t
GROUP BY t.name;
 name |      hobbies
------+-------------------
 Tim  | Football,Baseball
 Tom  | violin,Piano
(2 rows)

这里, hobbies 列是一个字符串,其中包含了一个用户的所有的业余爱好,使用逗号 , 分隔。

当然,您也可以使用 # 分隔,如下:

SELECT
    t.name,
    string_agg(t.hobby, '#') hobbies
FROM (
    SELECT 'Tim' name, 'Football' hobby
    UNION
    SELECT 'Tim' name, 'Baseball' hobby
    UNION
    SELECT 'Tom' name, 'Piano' hobby
    UNION
    SELECT 'Tom' name, 'violin' hobby
) t
GROUP BY t.name;
 name |      hobbies
------+-------------------
 Tim  | Football#Baseball
 Tom  | violin#Piano
(2 rows)