CONCAT函数是SQL里专门用来拼接多个字符串参数的内置函数,绝大多数主流关系型数据库都支持该函数,能够把多个字段、常量或者表达式的结果合并成一个完整的字符串,在数据处理、报表生成等场景中应用非常广泛。

CONCAT函数基础语法
CONCAT函数的基本语法非常简单,接收多个字符串类型的参数,按照参数传入的顺序依次拼接后返回结果,语法格式如下:
-- 基础语法,参数数量可以是2个及以上 CONCAT(string1, string2, ..., stringN)
需要注意的是,不同数据库对CONCAT函数的参数数量限制略有不同,比如MySQL支持至少2个参数,也可以传入更多参数,而部分数据库早期版本只支持2个参数,此时可以使用嵌套CONCAT的方式实现多参数拼接。
简单连接场景案例
基础字段拼接
最常见的需求是把表中的多个字段拼接成一个完整的字符串,比如把用户的姓和名拼接成完整姓名:
-- 假设用户表users有first_name和last_name两个字段 SELECT CONCAT(first_name, last_name) AS full_name FROM users;
带固定分隔符的连接
如果需要拼接的字符串之间需要分隔符,比如姓名之间加空格,地址之间加逗号,可以直接把分隔符作为字符串参数传入:
-- 姓名之间加空格分隔 SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users; -- 拼接用户所在城市和国家,用逗号分隔 SELECT CONCAT(city, ', ', country) AS location FROM user_address;
处理NULL值的拼接
如果拼接的参数中有NULL值,CONCAT函数在不同数据库中的表现不同,比如MySQL中CONCAT遇到NULL会直接返回NULL,此时可以结合IFNULL或者COALESCE函数处理空值:
-- 如果last_name为NULL,用空字符串代替,避免整个拼接结果为NULL SELECT CONCAT(first_name, ' ', IFNULL(last_name, '')) AS full_name FROM users;
复杂格式化场景案例
多字段组合格式化
当需要根据多个字段生成特定格式的内容时,比如生成用户的完整描述信息,包含姓名、年龄、所在城市:
SELECT CONCAT(
'用户:', first_name, ' ', last_name,
',年龄:', age,
',所在城市:', city
) AS user_desc
FROM users
LEFT JOIN user_address ON users.id = user_address.user_id;条件拼接
如果需要根据字段值的不同拼接不同的内容,可以结合CASE WHEN表达式实现条件拼接:
-- 根据用户状态拼接不同的后缀说明
SELECT CONCAT(
user_name,
CASE
WHEN status = 1 THEN '(正常)'
WHEN status = 0 THEN '(禁用)'
ELSE '(未知状态)'
END
) AS user_status_desc
FROM users;生成特定格式的编码
比如生成订单编号,需要固定前缀加日期加自增序号,此时可以结合日期函数和字符串拼接实现:
-- 生成格式为ORD-20240520-0001的订单编号
SELECT CONCAT(
'ORD-',
DATE_FORMAT(NOW(), '%Y%m%d'),
'-',
LPAD(order_seq, 4, '0')
) AS order_no
FROM order_sequence;使用注意事项
- 不同数据库的字符串拼接方式可能有差异,比如SQL Server除了CONCAT还可以用+号拼接,Oracle旧版本需要用||拼接,而CONCAT函数的兼容性更好
- 拼接的参数如果不是字符串类型,大部分数据库会自动将其转为字符串类型,但建议显式使用CAST函数转换,避免隐式转换带来的问题
- 如果拼接的内容过长,需要注意数据库对字符串长度的限制,避免拼接结果被截断