文章

MySQL 中的字符串拼接

最近在用数据直接导数据的时候,经常需要用到拼接的功能,将多个字段合并成一个字段输出,因此学习总结了一下 sql 中字符串拼接的相关知识。

CONCAT() 函数

MySQL 中拼接多个字符串的函数是 CONCAT , CONCAT 可以接收多个参数,输出的结果是将所有参数拼接起来的一个字符串,如果有任何一个参数为 NULL ,则返回值为 NULL。使用方式如下:

1
2
3
4
5
6
7
SELECT CONCAT("str1", "str2", "str3") AS A
// 查询结果为
str1str2str3

SELECT CONCAT("str1", "str2", "str3", NULL) AS A
// 查询结果为
NULL

CONCAT_WS() 函数

CONCAT_WS 表示 CONCAT With Separator,即:用分隔符拼接,使用方式跟 CONCAT 一样,只是第一个参数改为分隔符,后面同样可以接收多个参数,输出结果是将第二到最后一个参数用分隔符拼接起来的字符串。与 CONCAT 不同的是,CONCAT_WS 会忽略 NULL,参数中如果出现 NULL ,输出结果会将其忽略,但是如果分隔符为 NULL,则结果为 NULL。使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
SELECT CONCAT_WS(",", "str1","str2")
// 查询结果为
str1,str2

SELECT CONCAT_WS(",", "str1","str2",NULL,"str3")
// 查询结果为
str1,str2,str3

SELECT CONCAT_WS(NULL, "str1", "str2")
// 查询结果为
NULL

GROUP_CONCAT() 函数

GROUP_CONCAT 是给分组数据拼接使用的,将 GROUP BY 分组后的数据列合并成一行,默认使用 , 分隔符,可以通过 separator "指定的分隔符" 指定分隔符,具体用法如下:

  • 创建测试表,插入测试数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE `test_group_concat` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `group_id` int(11) DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test_group_concat` (`id`, `group_id`, `username`)
VALUES
	(1, 1, 'White'),
	(2, 2, 'Black'),
	(3, 1, 'Green'),
	(4, 1, 'Tony'),
	(5, 2, 'David'),
	(6, 1, 'White');
  • 使用 group_id 分组,把 username 字段的值拼接在一行,逗号分隔(默认)
1
2
3
4
5
6
7
select group_concat(username) from test_group_concat group by group_id;
+------------------------+
| group_concat(username) |
+------------------------+
| White,Green,Tony,White |
| Black,David            |
+------------------------+
  • 使用 group_id 分组,把 username 字段的值拼接在一行,分号分隔
1
2
3
4
5
6
7
select group_concat(username separator ";") from test_group_concat group by group_id;
+--------------------------------------+
| group_concat(username separator ";") |
+--------------------------------------+
| White;Green;Tony;White               |
| Black;David                          |
+--------------------------------------+
  • 使用 group_id 分组,把 username 字段去重之后的值拼接在一行,分号分隔
1
2
3
4
5
6
7
select group_concat(distinct username separator ";") from test_group_concat group by group_id;
+-----------------------------------------------+
| group_concat(distinct username separator ";") |
+-----------------------------------------------+
| Green;Tony;White                              |
| Black;David                                   |
+-----------------------------------------------+
  • 使用 group_id 分组,把 username 字段先前后拼上 ' 再拼接成一行,逗号分隔(默认)
1
2
3
4
5
6
7
select group_concat("'",username,"'") from test_group_concat group by group_id;
+--------------------------------+
| group_concat("'",username,"'") |
+--------------------------------+
| 'White','Green','Tony','White' |
| 'Black','David'                |
+--------------------------------+
  • 使用 group_id 分组,把 username 字段按 id 降序拼接成一行,逗号分隔(默认) (为了方便验证,再拼接上 id)
1
2
3
4
5
6
7
select group_concat("'",id,username,"'" order by id desc) from test_group_concat group by group_id;
+----------------------------------------------------+
| group_concat("'",id,username,"'" order by id desc) |
+----------------------------------------------------+
| '6White','4Tony','3Green','1White'                 |
| '5David','2Black'                                  |
+----------------------------------------------------+
  • 使用 group_id 分组,把 username 字段先前后拼上 ' 再拼接成一行,分号分隔
1
2
3
4
5
6
7
select group_concat("'",username,"'" separator ";") from test_group_concat group by group_id;
+----------------------------------------------+
| group_concat("'",username,"'" separator ";") |
+----------------------------------------------+
| 'White';'Green';'Tony';'White'               |
| 'Black';'David'                              |
+----------------------------------------------+
  • 使用 separator 指定了分隔符之后,后续就不能再拼接其他字符串了,也就是说 separator “;” 是跟在最后一个拼接参数后面
1
2
3
select group_concat("'",username,"'" separator ";","111") from test_group_concat group by group_id;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"111") from test_group_concat group by group_id' at line 1

总结

MySQL 中的字符串拼接主要用到的三个函数就是 CONCAT、CONCAT_WS、GROUP_CONCAT,前两个用于单独的字符串拼接,后一个需要结合 GROUP BY 使用,用于拼接分组后的某一字段或多个字段的值。GROUP_CONCAT 中的参数可以使用 DISTINCT、ORDER BY 等操作进一步处理数据。

本文由作者按照 CC BY 4.0 进行授权