在SQL查询场景中,将多个列的值合并为单个字符串是常见需求,CONCAT函数作为标准SQL提供的字符串拼接工具,支持多参数传入,能够直接完成多列的拼接操作,同时还可以和其他函数配合使用满足复杂的业务需求。

CONCAT函数基础语法
CONCAT函数的基本语法格式为CONCAT(str1, str2, ...),支持传入多个字符串参数,函数会按照参数的传入顺序将字符串拼接后返回。如果传入的参数中有NULL值,CONCAT函数会直接返回NULL,这是使用时需要特别注意的点。
以下是一个简单的多列拼接示例,假设存在用户表user_info,包含first_name、last_name、age三个列,需要拼接出用户的完整姓名和年龄信息:
-- 基础多列拼接示例 SELECT CONCAT(first_name, last_name, ',年龄:', age) AS user_desc FROM user_info;
多列拼接的常见场景处理
处理NULL值问题
如果拼接的列中存在NULL值,直接用CONCAT拼接会返回NULL,可以通过COALESCE函数给NULL值设置默认值,避免拼接结果异常:
-- 处理NULL值的多列拼接
SELECT CONCAT(
COALESCE(first_name, ''),
COALESCE(last_name, ''),
',年龄:',
COALESCE(CAST(age AS CHAR), '未知')
) AS user_desc
FROM user_info;拼接分隔符优化
如果需要在拼接的列之间添加固定分隔符,除了直接在CONCAT参数中传入分隔符字符串,还可以使用CONCAT_WS函数,第一个参数指定分隔符,后续参数传入需要拼接的列,会自动忽略NULL值:
-- 使用CONCAT_WS添加分隔符拼接
SELECT CONCAT_WS('-', first_name, last_name, age) AS user_info_str
FROM user_info;CONCAT函数的嵌套用法实战
嵌套TRIM函数处理空格
如果拼接的列值前后存在多余空格,可以在CONCAT内部嵌套TRIM函数先去除空格再拼接:
-- 嵌套TRIM处理列值空格
SELECT CONCAT(
TRIM(first_name),
TRIM(last_name),
',邮箱:',
TRIM(email)
) AS user_full_info
FROM user_info;嵌套CASE WHEN实现条件拼接
当需要根据列值的不同情况拼接不同内容时,可以在CONCAT中嵌套CASE WHEN条件判断:
-- 嵌套CASE WHEN实现条件拼接
SELECT CONCAT(
first_name,
last_name,
',状态:',
CASE
WHEN status = 1 THEN '正常'
WHEN status = 0 THEN '禁用'
ELSE '未知'
END
) AS user_status_desc
FROM user_info;嵌套日期函数处理时间列
如果拼接的内容包含日期类型的列,可以嵌套DATE_FORMAT函数将日期转为指定格式的字符串再拼接:
-- 嵌套日期函数处理时间列拼接
SELECT CONCAT(
first_name,
last_name,
',注册时间:',
DATE_FORMAT(create_time, '%Y年%m月%d日')
) AS user_register_desc
FROM user_info;不同数据库的差异说明
大部分关系型数据库都支持CONCAT函数,但部分数据库有特殊规则:MySQL的CONCAT函数支持无限个参数,而Oracle的CONCAT函数仅支持两个参数,多列拼接需要嵌套多个CONCAT函数。如果使用Oracle数据库,多列拼接示例如下:
-- Oracle中多列拼接需要嵌套CONCAT
SELECT CONCAT(CONCAT(first_name, last_name), CONCAT(',年龄:', age)) AS user_desc
FROM user_info;| 数据库类型 | CONCAT参数限制 | NULL值处理 |
|---|---|---|
| MySQL | 支持多个参数 | 任意参数为NULL则返回NULL |
| Oracle | 仅支持2个参数 | 任意参数为NULL则返回NULL |
| SQL Server | 不支持CONCAT函数,使用+号拼接 | 任意值为NULL则返回NULL |