字符串连接是SQL开发中的基础操作,无论是拼接查询字段、生成自定义格式数据还是处理多字段合并需求,都需要用到对应的字符串连接函数。不过不同数据库引擎对这类函数的支持差异较大,直接使用错误语法会导致执行失败,因此掌握各数据库对应的连接函数用法很有必要。

通用型连接函数CONCAT
CONCAT是目前兼容性最好的字符串连接函数,MySQL、PostgreSQL、Oracle 12c及以上版本都支持,语法非常简单,按顺序传入需要拼接的参数即可,函数会自动将非字符串参数转为字符串类型再拼接。
需要注意的是,MySQL的CONCAT函数在遇到NULL参数时,会直接返回NULL,而Oracle和PostgreSQL的CONCAT只会忽略NULL值。下面是一个MySQL的使用示例:
-- 拼接用户姓名和手机号,生成完整标识 SELECT CONCAT(user_name, '_', phone_number) AS user_identifier FROM user_info WHERE status = 1;
如果需要拼接多个字段,CONCAT支持传入任意多个参数,不需要嵌套使用,比如拼接地址的三个部分:
SELECT CONCAT(province, city, district, detail_address) AS full_address FROM address_table;
支持分隔符的连接函数CONCAT_WS
CONCAT_WS是CONCAT的扩展版本,第一个参数是指定的分隔符,后续参数是需要拼接的内容,函数会自动用分隔符把后续参数连接起来,并且会忽略NULL值,不会在结果中留下多余的分隔符。
这个函数非常适合生成带固定分隔符的字符串,比如生成用逗号分隔的标签列表:
-- 用逗号拼接用户的所有标签,忽略空标签
SELECT CONCAT_WS(',', tag1, tag2, tag3, tag4) AS user_tags
FROM user_tag_relation;如果分隔符本身传入NULL,CONCAT_WS会返回NULL,所以使用时需要确保分隔符参数有效。
不同数据库的专属连接方式
Oracle的||运算符
Oracle在12c之前不支持CONCAT的多参数用法,只能使用||运算符进行字符串拼接,这个运算符也兼容空值,遇到NULL时会当作空字符串处理。
-- Oracle中使用||拼接字符串 SELECT user_name || '的手机号是' || phone_number AS user_desc FROM user_info;
如果需要拼接多个字段,可以连续使用||运算符,不过如果字段较多,写法会比CONCAT更繁琐。
SQL Server的+运算符
SQL Server不支持CONCAT函数(2012之前的版本),也常用+运算符进行字符串拼接,但是和Oracle不同的是,只要有一个操作数是NULL,+运算的结果就会是NULL,需要提前用ISNULL函数处理空值。
-- SQL Server中处理空值后拼接字符串 SELECT ISNULL(user_name, '') + '_' + ISNULL(phone_number, '') AS user_identifier FROM user_info;
SQL Server 2012+的CONCAT支持
SQL Server 2012及更高版本也开始支持CONCAT函数,用法和MySQL一致,并且会自动忽略NULL值,比+运算符更友好,推荐使用新版本的用户优先使用CONCAT。
函数特性对比
下面是各常见连接方式的特性对比,方便开发者根据场景选择:
| 连接方式 | 支持数据库 | NULL处理 | 分隔符支持 |
|---|---|---|---|
| CONCAT | MySQL、PostgreSQL、Oracle12c+、SQL Server2012+ | MySQL返回NULL,其余忽略 | 需手动传分隔符参数 |
| CONCAT_WS | MySQL、PostgreSQL | 自动忽略NULL | 首个参数指定分隔符 |
| || | Oracle、PostgreSQL | Oracle忽略,PostgreSQL忽略 | 需手动拼接分隔符 |
| + | SQL Server | 遇NULL返回NULL | 需手动拼接分隔符 |
使用注意事项
- 拼接非字符串类型字段时,尽量提前确认是否需要手动转换类型,虽然多数CONCAT函数会自动转换,但部分场景下可能出现隐式转换错误。
- 跨数据库开发时,优先选择CONCAT函数,兼容性更好,避免使用数据库专属的运算符。
- 如果需要拼接大量字段且需要固定分隔符,优先使用CONCAT_WS,减少重复写分隔符的工作量。
- 处理可能为NULL的字段时,要么用CONCAT_WS忽略空值,要么提前用COALESCE或者ISNULL函数设置默认值,避免结果异常。