在SQL的实际开发中,文本合并是非常常见的操作,不同数据库的实现方式各有不同,主要分为专用合并函数和拼接操作符两类,下面分别介绍主流数据库的相关用法。

一、通用合并函数CONCAT
CONCAT是大多数关系型数据库都支持的标准字符串合并函数,作用是按顺序拼接多个字符串参数,如果参数中有NULL值,不同数据库的处理逻辑略有差异。
1. MySQL中的CONCAT函数
MySQL的CONCAT函数会忽略所有参数为NULL的情况,只要有一个参数不为NULL就会返回拼接结果,所有参数都为NULL时返回NULL。
-- 拼接两个普通字符串
SELECT CONCAT('Hello', ' ', 'World') AS result;
-- 拼接包含NULL的字符串,NULL会被忽略
SELECT CONCAT('Name:', NULL, '张三') AS result;
-- 拼接多个字段,假设有user表,包含first_name和last_name字段
SELECT CONCAT(first_name, last_name) AS full_name FROM user;2. PostgreSQL中的CONCAT函数
PostgreSQL的CONCAT函数会将NULL参数视为空字符串处理,不会返回NULL,拼接逻辑更友好。
-- NULL会被当作空字符串处理
SELECT CONCAT('User:', NULL, '李四') AS result;
-- 拼接多个字段和常量
SELECT CONCAT('用户ID:', id, ',姓名:', name) AS user_info FROM user_table;二、专用合并函数
除了通用的CONCAT函数,部分数据库还提供了自己的专用合并函数,适配特定的使用场景。
1. MySQL的CONCAT_WS函数
CONCAT_WS的第一个参数是指定的分隔符,后续参数会被该分隔符拼接,同时会自动忽略NULL值,非常适合需要统一分隔符的场景。
-- 用逗号作为分隔符拼接字符串,NULL会被自动忽略
SELECT CONCAT_WS(',', '北京', '海淀区', NULL, '中关村') AS address;
-- 拼接用户地址字段,用短横线分隔
SELECT CONCAT_WS('-', province, city, district) AS full_address FROM user_address;2. SQL Server的STRING_AGG函数
SQL Server 2017及以上版本提供了STRING_AGG函数,主要用于将多行数据的同一个字段合并成一个字符串,支持指定分隔符。
-- 假设有score表,包含student_name和score字段,按学生姓名分组拼接所有成绩 SELECT student_name, STRING_AGG(score, ',') AS all_scores FROM score GROUP BY student_name;
三、字符串拼接操作符
很多数据库支持使用特定的操作符直接拼接字符串,不需要调用函数,使用起来更简洁。
1. MySQL的拼接操作符||
MySQL默认情况下||是逻辑或操作符,需要开启PIPES_AS_CONCAT模式才会作为字符串拼接操作符使用,拼接时NULL会被忽略。
-- 开启拼接模式后使用||拼接 SET sql_mode = PIPES_AS_CONCAT; SELECT 'Hello' || ' ' || 'World' AS result;
2. PostgreSQL的拼接操作符||
PostgreSQL中||是默认的字符串拼接操作符,使用非常广泛,NULL参与拼接时会被当作空字符串。
-- 直接拼接字符串 SELECT '姓名:' || '王五' || ',年龄:' || 25 AS info; -- 拼接字段和常量 SELECT '用户:' || user_name || ',邮箱:' || email FROM user_info;
3. SQL Server的拼接操作符+
SQL Server使用+作为字符串拼接操作符,需要注意如果拼接的参数中有NULL,整个结果会返回NULL,需要提前处理NULL值。
-- 普通拼接 SELECT 'Hello' + ' ' + 'World' AS result; -- 处理NULL值后再拼接,用ISNULL将NULL转为空字符串 SELECT '地址:' + ISNULL(province, '') + ISNULL(city, '') FROM address_table;
四、不同数据库用法对比
下面通过表格整理主流数据库的字符串合并方式,方便开发者快速查询:
| 数据库类型 | 合并函数 | 拼接操作符 | NULL处理逻辑 |
|---|---|---|---|
| MySQL | CONCAT、CONCAT_WS | ||(需开启模式) | 忽略NULL |
| PostgreSQL | CONCAT | || | 视为空字符串 |
| SQL Server | STRING_AGG、CONCAT | + | 存在NULL则结果为NULL |
| Oracle | CONCAT(仅支持两个参数)、|| | || | 视为空字符串 |
五、使用注意事项
- 使用拼接操作符前先确认当前数据库的语法规则,避免把逻辑操作符当成拼接符使用。
- 拼接字段时如果有NULL值,提前用COALESCE或者对应数据库的NULL处理函数转换,避免结果不符合预期。
- 多行数据合并成字符串的场景优先使用STRING_AGG这类聚合函数,比手动循环拼接效率更高。
- 拼接大量字符串时注意数据库对字符串长度的限制,避免超出长度导致截断或者报错。