CONCAT是SQL中用于拼接多个字符串的标准函数,几乎被所有主流关系型数据库支持,它的核心作用是将传入的多个字符串参数按顺序合并成一个完整的字符串。在不同的数据库版本中,CONCAT函数的行为可能存在细微差异,但基础用法保持一致。

CONCAT函数基础语法
CONCAT函数的基础语法格式如下,参数为需要拼接的字符串,参数数量没有固定限制,最少可以传入1个参数:
-- 基础语法 CONCAT(string1, string2, ..., string_n)
下面通过一个简单的示例展示CONCAT的基础拼接效果,将用户的姓和名拼接成完整姓名:
SELECT CONCAT('张', '三') AS full_name;
-- 执行结果:full_name 的值为 张三多参数拼接场景
CONCAT支持同时传入多个字符串参数,会将所有参数按顺序拼接,不需要嵌套调用。比如拼接地址的省、市、区三个部分:
SELECT CONCAT('广东省', '深圳市', '南山区') AS full_address;
-- 执行结果:full_address 的值为 广东省深圳市南山区如果传入的是表字段,也可以直接拼接,以下是一个用户表user的拼接示例,将用户的id、姓名和邮箱拼接成描述信息:
-- 假设user表有id、name、email三个字段
SELECT CONCAT('用户ID:', id, ' 姓名:', name, ' 邮箱:', email) AS user_desc FROM user;空值处理逻辑
CONCAT函数对空值的处理在不同数据库中略有区别,不过主流的MySQL、PostgreSQL中,如果CONCAT的参数中包含NULL值,整个拼接结果会直接返回NULL,这是初学者经常踩的坑。
-- 参数包含NULL,结果为NULL
SELECT CONCAT('hello', NULL, 'world') AS result;
-- 执行结果:result 的值为 NULL如果需要避免空值导致拼接结果为NULL,可以配合COALESCE函数使用,将NULL值替换为空字符串:
-- 使用COALESCE处理NULL值,将NULL替换为空字符串
SELECT CONCAT('hello', COALESCE(NULL, ''), 'world') AS result;
-- 执行结果:result 的值为 helloworld与CONCAT_WS的区别
CONCAT_WS是CONCAT的扩展函数,全称是Concatenate With Separator,支持指定分隔符拼接字符串,第一个参数是分隔符,后面的参数是需要拼接的字符串,并且会自动忽略NULL值,不会返回NULL。
-- CONCAT_WS用法,第一个参数是分隔符
SELECT CONCAT_WS('-', '2024', '05', '20') AS date_str;
-- 执行结果:date_str 的值为 2024-05-20
-- 忽略NULL值
SELECT CONCAT_WS('-', '2024', NULL, '20') AS date_str;
-- 执行结果:date_str 的值为 2024-20不同数据库中的使用差异
虽然CONCAT是标准SQL函数,但不同数据库的实现存在差异,以下是常见数据库的情况:
| 数据库类型 | CONCAT特性 |
|---|---|
| MySQL | 支持多参数,参数含NULL返回NULL,8.0+版本支持窗口函数场景下的拼接 |
| PostgreSQL | 支持多参数,参数含NULL返回NULL,也可以使用||操作符实现拼接 |
| Oracle | 只支持两个参数,多参数拼接需要嵌套调用,参数含NULL返回原字符串拼接结果 |
| SQL Server | 2012+版本支持CONCAT函数,低版本需要使用+操作符拼接,参数含NULL返回NULL |
实际应用场景示例
实际开发中CONCAT常用于生成完整的信息字段,比如生成商品的完整标题,拼接订单的完整描述等:
-- 商品表product有category、brand、product_name字段,生成完整商品标题
SELECT
CONCAT(category, ' ', brand, ' ', product_name) AS full_product_name
FROM product
WHERE id = 1001;
-- 订单表order有order_id、user_name、create_time字段,生成订单描述
SELECT
CONCAT('订单号:', order_id, ' 下单用户:', user_name, ' 下单时间:', create_time) AS order_desc
FROM order_table
LIMIT 10;在使用CONCAT时,需要注意参数的类型,如果传入的是数字类型,CONCAT会自动将其转换为字符串再拼接,不需要手动转换类型。如果拼接的内容包含特殊字符,比如单引号,需要进行转义处理,避免SQL语法错误。