在关系型数据库中,数据往往按照范式设计分散存储在多个列里,但在实际展示时又希望把相关字段拼成一段完整文本。SQL提供的CONCAT函数能够帮助我们在查询阶段就完成提取与合并,让结果集直接满足业务展示需求。

CONCAT函数的基本语法
CONCAT函数用于将一个或多个字符串参数连接成一个字符串,标准语法如下:
-- 将姓和名合并为全名 SELECT CONCAT(last_name, first_name) AS full_name FROM users;
在大多数数据库中,CONCAT可接受两个或更多参数。例如MySQL允许传入任意多个参数,而部分旧版本SQL Server只支持两个参数,此时可使用加号或嵌套调用。
处理分隔符与空值
合并时通常需要添加分隔符,并且要注意NULL值的影响。在MySQL中,CONCAT遇NULL会返回NULL,可改用CONCAT_WS或IFNULL处理:
-- 使用CONCAT_WS自动忽略NULL并以逗号分隔
SELECT CONCAT_WS(',', city, district, street) AS address
FROM user_address;
-- 使用IFNULL避免NULL导致整体为空
SELECT CONCAT(IFNULL(nickname, '匿名'), ':', IFNULL(phone, '未填写')) AS info
FROM members;
与其他函数结合提取合并
CONCAT常与提取函数配合,比如从日期中取年月,或清理空格后合并:
-- 提取年份与姓名合并显示 SELECT CONCAT(YEAR(create_time), '年注册:', TRIM(user_name)) AS label FROM accounts;
不同数据库注意事项
| 数据库 | CONCAT参数限制 | NULL处理 |
|---|---|---|
| MySQL | 支持多参数 | 任一为NULL则结果为NULL |
| SQL Server | 仅两个参数 | NULL视为空字符串 |
| PostgreSQL | 支持多参数 | NULL视为空字符串 |
实际查询示例
假设订单表含收货人、手机、地区,需合并成物流标签:
SELECT order_id,
CONCAT_WS(' | ', receiver, phone, CONCAT(province, city))
AS ship_label
FROM orders
WHERE status = 1;
通过上述方式,我们能够在一条SQL语句内完成数据提取与合并显示,减少应用层代码复杂度,也方便导出报表时直接获得可读内容。