PostgreSQL string_agg() Function
The PostgreSQL string_agg() function is an aggregate function that returns a string containing all the specified values in a group.
string_agg() Syntax
Here is the syntax of the PostgreSQL string_agg() function:
string_agg(expr, delimiter TEXT) -> TEXT
Typically, we use the string_agg() function like:
SELECT string_agg(expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];
Parameters
expr-
Required. A column name or expression in which all values will be concatenated.
delimiter-
Required. The delimiter.
Return value
The PostgreSQL string_agg() function returns a string that contains all the values in the specified expression or column in the specified group, including null, where multiple values are separated by delimiter.
string_agg() Examples
To demonstrate usages of the PostgreSQL string_agg() function, we simulate a temporary table using the following statement with UNION and SELECT:
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)Here, we have some rows about the user’s hobbies. The name column is the user’s name, and the hobby column is a hobby of a user.
Suppose, to put all the hobbies of each user in a string (separated by commas) for each user (users with the same name count as one user), you can use the GROUP BY clause to group all rows by name, and use the string_agg() function to combine the hobby values in each group into a string. The following statement fulfills this requirement:
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)Here, the hobbies column is a string containing all of a user’s hobbies, separated by commas ,.
Of course, you can also use the separator #, as follows:
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)