CONCAT
是 SQL 中用于连接多个字符串的函数,可以将多个字段、常量或表达式拼接成一个完整的字符串。它在模糊查询、动态生成文本等场景中非常实用,尤其是在需要动态拼接通配符(如 %
)的情况下。
核心功能
-
字符串拼接
将多个输入参数按顺序连接成一个字符串。SELECT CONCAT('Hello', ' ', 'World'); -- 输出:Hello World
-
处理不同类型的数据
自动将非字符串类型(如数字、日期)转换为字符串。SELECT CONCAT('用户ID:', 1001); -- 输出:用户ID:1001
-
支持动态拼接通配符
常用于构建模糊查询(LIKE
)的条件。SELECT * FROM users WHERE name LIKE CONCAT('%', 'Alice', '%'); -- 匹配包含 "Alice" 的名字
不同数据库的语法差异
数据库 | 语法示例 | 备注 |
---|---|---|
MySQL | CONCAT(str1, str2, ...) | 支持多参数,输入为 NULL 时返回 NULL |
PostgreSQL | `str1 | |
Oracle | `str1 | |
SQL Server | str1 + str2 或 CONCAT(str1, str2, ...) | + 是传统方式,CONCAT 忽略 NULL |
常见使用场景
1. 模糊查询(LIKE)
动态拼接通配符 %
和查询值:
-- 查询名字包含 "John" 的用户(不依赖应用程序拼接)
SELECT * FROM users
WHERE name LIKE CONCAT('%', 'John', '%');
2. 生成完整文本
合并多个字段或常量:
-- 生成用户全名(例如:Alice Smith [ID:1001])
SELECT CONCAT(first_name, ' ', last_name, ' [ID:', user_id, ']')
FROM users;
3. 处理 NULL 值
部分数据库(如 PostgreSQL)的 CONCAT
会自动忽略 NULL
:
-- 如果 middle_name 为 NULL,结果仍为 "Alice Smith"
SELECT CONCAT(first_name, ' ', middle_name, ' ', last_name)
FROM users;
注意事项
-
NULL 值处理
• MySQL 中,若任意输入参数为NULL
,CONCAT
返回NULL
。
• 可通过IFNULL
或COALESCE
避免:SELECT CONCAT(COALESCE(first_name, ''), ' ', COALESCE(last_name, '')) FROM users;
-
性能问题
频繁拼接大字段(如TEXT
)可能影响性能,需结合业务需求优化。 -
跨数据库兼容性
优先使用||
(标准 SQL 运算符)或框架提供的拼接工具(如 MyBatis 的<bind>
)。
示例代码
在 MyBatis/MyBatis-Plus 中动态拼接模糊查询:
<select id="searchUsers" resultType="User">
SELECT * FROM users
WHERE name LIKE CONCAT('%', #{keyword}, '%') -- MySQL
<!-- 或(PostgreSQL) -->
<!-- WHERE name LIKE '%' || #{keyword} || '%' -->
</select>
处理 NULL 值(Java + MySQL):
// 在 Service 层确保参数非 NULL
public List<User> searchUsers(String keyword) {
String safeKeyword = StringUtils.defaultIfEmpty(keyword, "");
return userMapper.searchUsers(safeKeyword);
}
总结
CONCAT
的核心作用是将多个字符串连接成一个完整字符串,适用于:
• 动态构建模糊查询条件(LIKE '%值%'
)。
• 生成组合文本(如全名、地址)。
• 跨字段数据拼接。
使用时需注意数据库类型差异和 NULL
值处理,合理利用可大幅简化 SQL 逻辑。