跳到主要内容
版本: 最新版本-3.5

group_concat

将一个组中的非空值连接成一个字符串,带有一个 sep 参数,如果未指定,则默认为 , 。此函数可用于将一列中多行的值连接成一个字符串。

group_concat 在 3.0.6 之后的 3.0 版本和 3.1.3 之后的 3.1 版本中支持 DISTINCT 和 ORDER BY。

语法

VARCHAR GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR sep])

参数

  • expr:要连接的值,忽略空值。它必须解析为 VARCHAR。您可以选择指定 DISTINCT 以从输出字符串中消除重复值。如果要直接连接多个 expr,请使用 concatconcat_ws 来指定格式。
  • ORDER BY 中的项目可以是无符号整数(从 1 开始)、列名或普通表达式。结果默认按升序排序。您也可以显式指定 ASC 关键字。如果要按降序对结果进行排序,请将 DESC 关键字添加到要排序的列的名称中。
  • sep:用于连接不同行中的非空值的可选分隔符。如果未指定,则默认使用 , (逗号)。要消除分隔符,请指定空字符串 ''

注意

从 v3.0.6 和 v3.1.3 开始,指定分隔符时行为发生了变化。您必须使用 SEPARATOR 来声明分隔符,例如,select group_concat(name SEPARATOR '-') as res from ss;

返回值

为每个组返回一个字符串值,如果没有非 NULL 值,则返回 NULL。

您可以通过设置会话变量 group_concat_max_len 来限制 group_concat 返回的字符串的长度,该变量默认为 1024。最小值:4。单位:字符。

示例

SET [GLOBAL | SESSION] group_concat_max_len = <value>;

示例

  1. 创建一个包含科目分数的表 ss

    CREATE TABLE `ss` (
    `id` int(11) NULL COMMENT "",
    `name` varchar(255) NULL COMMENT "",
    `subject` varchar(255) NULL COMMENT "",
    `score` int(11) NULL COMMENT ""
    ) ENGINE=OLAP
    DUPLICATE KEY(`id`)
    DISTRIBUTED BY HASH(`id`) BUCKETS 4
    PROPERTIES (
    "replication_num" = "1"
    );

    insert into ss values (1,"Tom","English",90);
    insert into ss values (1,"Tom","Math",80);
    insert into ss values (2,"Tom","English",NULL);
    insert into ss values (2,"Tom",NULL,NULL);
    insert into ss values (3,"May",NULL,NULL);
    insert into ss values (3,"Ti","English",98);
    insert into ss values (4,NULL,NULL,NULL);
    insert into ss values (NULL,"Ti","Phy",98);

    select * from ss order by id;
    +------+------+---------+-------+
    | id | name | subject | score |
    +------+------+---------+-------+
    | NULL | Ti | Phy | 98 |
    | 1 | Tom | English | 90 |
    | 1 | Tom | Math | 80 |
    | 2 | Tom | English | NULL |
    | 2 | Tom | NULL | NULL |
    | 3 | May | NULL | NULL |
    | 3 | Ti | English | 98 |
    | 4 | NULL | NULL | NULL |
    +------+------+---------+-------+
  2. 使用 group_concat。

示例 1:将名称连接成一个字符串,使用默认分隔符并忽略空值。重复的名称会被保留。

 select group_concat(name) as res from ss;
+---------------------------+
| res |
+---------------------------+
| Tom,Tom,Ti,Tom,Tom,May,Ti |
+---------------------------+

示例 2:将名称连接成一个字符串,用分隔符 - 连接并忽略空值。重复的名称会被保留。

 select group_concat(name SEPARATOR '-') as res from ss;
+---------------------------+
| res |
+---------------------------+
| Ti-May-Ti-Tom-Tom-Tom-Tom |
+---------------------------+

示例 3:将不同的名称连接成一个字符串,使用默认分隔符并忽略空值。重复的名称会被删除。

 select group_concat(distinct name) as res from ss;
+---------------------------+
| res |
+---------------------------+
| Ti,May,Tom |
+---------------------------+

示例 4:按 score 的升序连接同一 ID 的 name-subject 字符串。例如,TomMathTomEnglish 共享 ID 1,它们以逗号分隔,并按 score 的升序排列。

 select id, group_concat(distinct name,subject order by score) as res from ss group by id order by id;
+------+--------------------+
| id | res |
+------+--------------------+
| NULL | TiPhy |
| 1 | TomMath,TomEnglish |
| 2 | TomEnglish |
| 3 | TiEnglish |
| 4 | NULL |
+------+--------------------+

示例 5:group_concat 与 concat() 嵌套使用,concat() 用于将 name-subject 组合成一个字符串。同一行中的字符串按 score 的升序排序。

 select id, group_concat(distinct concat(name, '-',subject) order by score) as res from ss group by id order by id;
+------+----------------------+
| id | res |
+------+----------------------+
| NULL | Ti-Phy |
| 1 | Tom-Math,Tom-English |
| 2 | Tom-English |
| 3 | Ti-English |
| 4 | NULL |
+------+----------------------+

示例 6:未找到匹配结果,返回 NULL。

select group_concat(distinct name) as res from ss where id < 0;
+------+
| res |
+------+
| NULL |
+------+

示例 7:将返回的字符串的长度限制为六个字符。

 set group_concat_max_len = 6;

select id, group_concat(distinct name,subject order by score) as res from ss group by id order by id;
+------+--------+
| id | res |
+------+--------+
| NULL | TiPhy |
| 1 | TomMat |
| 2 | NULL |
| 3 | TiEngl |
| 4 | NULL |
+------+--------+

关键词

GROUP_CONCAT,CONCAT,ARRAY_AGG