mysql的concat函数支持多参数,按序拼接非null值,遇null则整体返回null;postgresql、sql server的concat自动跳过null;oracle原生concat仅支持两参数,多字段需用||或嵌套。

CONCAT 函数在 MySQL 中怎么拼多个字段
MySQL 的 CONCAT 函数直接支持多参数,不用嵌套调用。它会把所有非 NULL 参数按顺序连成一个字符串;只要有一个参数是 NULL,整个结果就变成 NULL——这是最常踩的坑。
常见写法:SELECT CONCAT(first_name, ' ', last_name) FROM users;
- 参数可以是字段、字符串字面量、函数返回值(如
UPPER(name)) - 空字符串
''不影响结果,但NULL会“污染”整个拼接结果 - 如果字段可能为空,得先用
IFNULL或COALESCE处理,比如: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_name是NULL,也会得到类似"John Smith"的结果
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的适用场景











