SQL字符串拼接方法_CONCAT使用技巧

5次阅读

concat是sql中常用字符串拼接函数,但各数据库对空值处理和语法支持存在差异:mysql 5.7+将NULL视为空字符串,而postgresql、sql server等遇null即返回null;跨库建议用||或coalesce兜底。

SQL字符串拼接方法_CONCAT使用技巧

CONCAT 是 SQL 中最常用、最直观的字符串拼接函数,但不同数据库对它的支持和行为有明显差异。掌握它的基本用法和常见陷阱,能避免空值导致结果为 NULL、兼容性问题等实际开发中的坑。

基础用法:连接多个非空字符串

标准写法是 CONCAT(str1, str2, …, strN),按顺序把所有参数连成一个字符串。例如:

  • MySQL:select CONCAT('Hello', ' ', 'World'); → 返回 'Hello World'
  • PostgreSQL(需启用 pg_trgm 或使用 ||,原生不支持 CONCAT,但 9.1+ 已内置)
  • SQL Server 2012+ 和 oracle 12c+ 也支持标准 CONCAT,但早期版本需用 +||

空值(NULL)处理:最容易踩的坑

多数数据库中,只要任意一个参数为 NULL,CONCAT 结果就为 NULL(MySQL 5.7+ 是例外,会把 NULL 当作空字符串处理)。例如:

  • MySQL 8.0:CONCAT('a', NULL, 'b')'ab'
  • PostgreSQL / SQL Server:CONCAT('a', NULL, 'b')NULL
  • 安全写法(通用):CONCAT(COALESCE(col1, ''), COALESCE(col2, ''))

替代方案与跨库兼容技巧

如果需要兼容老版本或多种数据库,建议优先考虑更稳定的拼接方式:

  • 使用双竖线:col1 || ' ' || col2(PostgreSQL、Oracle、SQL Server 2012+ 支持)
  • SQL Server 可用加号:col1 + ' ' + col2(注意:任一列为 NULL 时整条结果为 NULL)
  • MySQL 中可搭配 IFNULLCOALESCE 做兜底:CONCAT(IFNULL(name, ''), '(', IFNULL(phone, ''), ')')

实用场景:生成带格式的业务字段

常用于构造展示用字段,比如用户全名、地址组合、日志摘要等:

  • 拼接姓名(容忍中间名为空):CONCAT(last_name, ', ', first_name, COALESCE(CONCAT(' ', middle_name), ''))
  • 生成邮箱前缀提示:CONCAT(LEFT(email, 2), '***', SUBSTRING_INDEX(email, '@', -1))(MySQL 示例)
  • 构造 URL 片段:CONCAT('/user/', id, '-', REPLACE(name, ' ', '-'))

注意:CONCAT 不自动添加空格或分隔符,所有格式符号都要显式写出;多表拼接时建议先用 COALESCE 统一空值处理逻辑,再拼接,避免意外中断。

text=ZqhQzanResources