位置:首页 > SQL > SQL CONCAT 怎么拼接多个字段?MySQL、PostgreSQL、SQL Server、Oracle 用法对比

SQL CONCAT 怎么拼接多个字段?MySQL、PostgreSQL、SQL Server、Oracle 用法对比

时间:2026-08-23  |  作者:游戏探长  |  阅读:0

MySQL的CONCAT函数能支持多个参数,会按照顺序拼接非NULL值,一旦遇到NULL值,那么整体就会返回NULL;而PostgreSQL和SQL Server的CONCAT函数会自动跳过NULL值;Oracle原生的CONCAT函数仅支持两个参数,要是有多个字段需要拼接,就得使用||或者进行嵌套。

如何使用SQL CONCAT函数拼接多个字段

CONCAT 函数在 MySQL 中怎么拼多个字段

MySQL的CONCAT函数,那可是直接支持多参数的,完全不需要嵌套调用哦。它会把所有不是NULL的参数,按照顺序依次连接成一个字符串。但这里有个特别需要注意的地方,只要其中有一个参数是NULL,那么整个结果就会变成NULL,这可是很多人经常会踩的坑呀。

常见写法:SELECT CONCAT(first_name, ' ', last_name) FROM users;

  • 参数可以是字段、字符串字面量、函数返回值(如 UPPER(name)
  • 空字符串 '' 不影响结果,但 NULL 会“污染”整个拼接结果
  • 如果字段可能为空,得先用 IFNULLCOALESCE 处理,比如:CONCAT(IFNULL(first_name, ''), ' ', IFNULL(last_name, ''))

PostgreSQL 没有 CONCAT,得用 || 操作符或 CONCAT() 函数

PostgreSQL 9.1+ 提供了标准 CONCAT 函数,行为和 MySQL 接近(自动跳过 NULL),但更老版本或习惯写法常用双竖线 || 连接符。

区别很关键:col1 || col2 遇到 NULL 时只让那一项变 NULL,整体结果不一定是 NULL;而 CONCAT(col1, col2) 明确忽略 NULL 值。

  • 推荐统一用 CONCAT,语义清晰且跨版本兼容性更好
  • 注意:PostgreSQL 的 CONCAT 至少要一个非 NULL 参数,否则返回空字符串,不是 NULL
  • 示例:SELECT CONCAT(first_name, ' ', middle_name, ' ', last_name) FROM people; 即使 middle_nameNULL,也会得到类似 "JohnSmith" 的结果

SQL Server 的 CONCAT 函数默认处理 NULL,但版本要求高

SQL Server 2012+ 才支持 CONCAT,它的设计就是为了解决 + 拼接时遇到 NULL 直接失败的问题。它会把所有参数转成字符串,并跳过 NULL

  • 不要混用 +CONCAT:用 + 时必须手动 ISNULL(col, ''),否则整行结果变 NULL
  • CONCAT 会隐式转换类型,比如 CONCAT(name, age)age 是 int,会被转成字符串,无需 CAST
  • 如果兼容旧版本(如 SQL Server 2008),只能靠 ISNULL + + 组合,写起来啰嗦且易漏

Oracle 里没有 CONCAT 支持多字段,得用双管道或 LISTAGG

Oracle 的原生 CONCAT 函数只接受两个参数,想拼三个及以上字段,必须嵌套调用或者换用 || 操作符——后者才是实际主流用法。

  • CONCAT(CONCAT(first, ' '), last) 写法难读又容易括号错位
  • 直接用 first || ' ' || middle || ' ' || last 更直观,且 ||NULL 的处理是“留空”,不会中断拼接
  • 如果要在分组后拼接多行值(比如一个人的多个邮箱),得用 LISTAGG(email, '; ') WITHIN GROUP (ORDER BY email),不是 CONCAT 的适用场景
不同数据库对 NULL 的容忍度差异极大,拼接前务必确认字段是否可空,以及目标数据库的 CONCAT 行为——光写对函数名,结果可能全错。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

精选合集

更多

大家都在玩