在MySQL的实际开发场景中,经常需要将多个零散的字符串按照固定分隔符拼接成完整内容,比如将用户的省、市、区地址拼接成完整地址,或者将多个商品标签用逗号分隔后存储。普通的多字符串拼接如果使用CONCAT函数,不仅需要在每个参数之间手动添加分隔符,还会因为某个参数为空值导致整个拼接结果为空,使用起来不够便捷。MySQL提供了专门的CONCAT_WS函数来解决这类需求,它可以指定统一的分隔符,还能自动忽略空值参数,大幅提升拼接操作的效率。

CONCAT_WS函数的基本语法
CONCAT_WS函数的全称是Concatenate With Separator,即带分隔符的拼接函数,它的基本语法格式如下:
-- 语法格式 CONCAT_WS(separator, str1, str2, ..., strN)
参数说明:
- separator:必填参数,表示拼接时使用的分隔符,可以是任意字符串,比如逗号、横杠、空格等。
- str1到strN:必填参数,表示需要拼接的多个字符串,最少需要两个字符串参数,也可以传入更多个。
函数的返回结果是所有非空字符串参数按照传入顺序,用分隔符连接后的字符串,如果所有字符串参数都为空,那么返回空字符串。
CONCAT_WS与CONCAT函数的区别
很多开发者会混淆CONCAT和CONCAT_WS的用法,两者的核心区别如下:
| 对比项 | CONCAT函数 | CONCAT_WS函数 |
|---|---|---|
| 分隔符处理 | 没有内置分隔符,需要手动在每个参数之间添加分隔符 | 可以统一指定分隔符,不需要手动逐个添加 |
| 空值处理 | 只要有一个参数为NULL,整个返回结果就是NULL | 会自动忽略NULL参数,只拼接非NULL的字符串 |
| 参数要求 | 最少需要1个参数 | 最少需要2个参数,第一个是分隔符,后面是待拼接字符串 |
CONCAT_WS的实际使用示例
示例1:拼接普通字符串
将三个字符串用横杠作为分隔符拼接:
-- 拼接结果为 2024-05-20
SELECT CONCAT_WS('-', '2024', '05', '20') AS date_str;
示例2:拼接包含空值的字符串
当待拼接的参数中有NULL时,CONCAT_WS会自动忽略NULL:
-- 拼接结果为 张三-北京,NULL的地址参数被忽略
SELECT CONCAT_WS('-', '张三', NULL, '北京') AS user_info;
示例3:拼接表中字段
假设有一张user表,结构如下:
CREATE TABLE user (
id INT PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(20),
city VARCHAR(20),
district VARCHAR(20)
);
表中有一条数据:id=1, first_name='张', last_name='三', city='北京', district=NULL。现在需要拼接用户的完整姓名和所在城市,用空格作为分隔符:
-- 拼接结果为 张三 北京,district的NULL值被忽略
SELECT CONCAT_WS(' ', CONCAT_WS('', first_name, last_name), city, district) AS full_info FROM user WHERE id=1;
使用注意事项
- 分隔符参数本身如果是NULL,那么整个函数的返回结果就是NULL,因为分隔符无法生效。
- 如果待拼接的字符串参数都是空字符串,那么返回的结果是空字符串,而不是NULL。
- CONCAT_WS函数支持拼接数字类型的参数,MySQL会自动将数字转换为字符串后再进行拼接。
- 如果需要拼接的分隔符是特殊字符,比如单引号,需要对分隔符进行转义,比如拼接用单引号分隔的字符串:
CONCAT_WS(''', 'a', 'b'),返回结果为a'b。
如果业务中需要拼接的字符串数量不固定,也可以结合GROUP_CONCAT函数使用,GROUP_CONCAT可以在分组场景下将同一组的多个字符串用指定分隔符拼接,适合一对多的场景拼接需求。