Skip to content

group_concat and string_agg ​

Calculates a string from the non-NULL values in a group, separated by a delimiter.

group_concat uses a comma when the delimiter is omitted. string_agg is the two-argument alias and requires an explicit delimiter.

Syntax

text
group_concat(value [, separator] [ORDER BY expression])
string_agg(value, separator [ORDER BY expression])

Arguments

  • value — The value to concatenate. Non-text values are converted to their text representation. NULL values are skipped.
  • separator — The text placed between contributing values. The default for group_concat is ','. A NULL separator adds no bytes.

When the separator is an expression that varies by row, each contributing row after the first uses its own separator. No separator is written before the first value.

Returned value

A text string. Empty and all-NULL inputs return NULL. A contributing empty string produces an empty string, rather than NULL.

Examples

Joining employee names

sql
CREATE TABLE employees (name TEXT);
INSERT INTO employees VALUES ('Grace'), ('Ada'), (NULL), ('Linus');
sql
SELECT group_concat(name, ', ' ORDER BY name) AS names
FROM employees
FORMAT csv;
text
"Ada, Grace, Linus"

Using the default separator and an explicit separator

sql
CREATE TABLE items (value TEXT);
INSERT INTO items VALUES ('b'), ('a'), ('c');
sql
SELECT group_concat(value ORDER BY value),
       string_agg(value, ' | ' ORDER BY value)
FROM items
FORMAT csv;
text
"a,b,c","a | b | c"

Removing duplicate values

sql
CREATE TABLE tags (value TEXT);
INSERT INTO tags VALUES ('sql'), ('rust'), ('sql');
sql
SELECT group_concat(DISTINCT value ORDER BY value)
FROM tags
FORMAT csv;
text
"rust,sql"