SQL字符串拼接_CONCAT函数使用详解

11次阅读

concat 函数用于按序拼接多个字符串,mysql 中任一 null 致结果为 null,sql server/postgresql 则忽略 null;多参数拼接推荐 concat_ws(自动跳过 null 且支持分隔符);需注意隐式转换、索引失效及跨行聚合应选用 group_concat 或 string_agg。

SQL 字符串拼接_CONCAT 函数使用详解

SQL 中的 CONCAT 函数是拼接字符串最直接的工具,核心作用是把多个字符串值按顺序合并成一个新字符串。它在 MySQL、PostgreSQL、SQL Server 等主流数据库中都支持,但行为细节有差异,使用时需注意。

CONCAT 基本用法与参数规则

语法为 CONCAT(str1, str2, ……),支持两个或更多参数,可以是字段名、字面量、表达式甚至数字或日期(数据库会自动转为字符串)。

  • MySQL 中:若任一参数为NULL,整个结果返回NULL;例如 CONCAT('a', NULL, 'c')NULL
  • SQL Server 和 PostgreSQL 中:NULL被视为空字符串处理;CONCAT('a', NULL, 'c')'ac'
  • Oracle 例外:只支持两个参数,多字段拼接需嵌套,如 CONCAT(CONCAT(col1, col2), col3)

带分隔符的拼接:CONCAT_WS 更实用

当需要统一加逗号、竖线或空格等分隔符时,CONCAT_WS(separator, str1, str2, ……)比反复写 CONCAT 更简洁可靠。

  • 第一个参数是分隔符,后续才是待拼接内容
  • 分隔符本身为 NULL 时,整条语句返回NULL
  • 但参数中的 NULL 会被自动跳过,不产生多余分隔符;例如 CONCAT_WS(',','A',NULL,'C')'A,C'
  • 适合生成报表字段、导出 CSV 格式数据等场景

常见搭配与避坑要点

实际写 SQL 时,CONCAT常与其他函数配合使用,也容易踩几个典型坑:

  • 数字字段直接拼接可能触发二进制隐式转换(MySQL),导致乱码或警告;建议显式转类型:CONCAT(CAST(age AS CHAR), '岁')
  • 想在拼接前后加括号、引号等符号,记得用单引号包裹,如 CONCAT('(', tel, ')')
  • WHERE 条件结合时,注意避免全表扫描;例如 WHERE name LIKE CONCAT('%', @keyword, '%') 虽然可行,但不如全文索引或前缀匹配高效
  • 若需对分组后多行数据拼接(如“一人多角色”),应改用 GROUP_CONCAT(MySQL)或STRING_AGG(PostgreSQL/SQL Server),CONCAT 无法跨行工作

替代方案与兼容性提示

不是所有环境都支持CONCAT,可考虑这些等效写法:

  • SQL Server:可用 + 运算符,如 first_name + ' ' + last_name;但任一操作数为 NULL 时结果为 NULL,不如CONCAT 鲁棒
  • PostgreSQL:支持标准 || 操作符,如 first_name || ' ' || last_name
  • 老版本 MySQL(CONCAT 多参数,只能嵌套或改用CONCAT_WS
text=ZqhQzanResources