mysql用concat_ws()或ifnull/coalesce处理null更安全;postgresql推荐||配合coalesce或array_to_string();sql server用+拼接需cast类型并用isnull兜底;所有场景均需先select验证、加where条件、注意not null约束。

MySQL 中用 CONCAT() 更新汇总列
直接用 UPDATE 配合 CONCAT() 就能一次性拼接多列并写入新字段。注意空值会污染整个结果——CONCAT() 遇到 NULL 返回 NULL,不是跳过或转为空字符串。
- 用
CONCAT_WS()更安全:第一个参数是分隔符,自动跳过NULL值,比如CONCAT_WS(' - ', col1, col2, col3) - 显式处理空值:用
IFNULL(col, '')或COALESCE(col, '')替换NULL - 别漏掉
WHERE条件:没加条件会全表更新,容易误操作 - 示例:
UPDATE users SET summary = CONCAT_WS(' | ', name, IFNULL(phone, ''), email);
PostgreSQL 里用 || 操作符或 STRING_AGG()
PostgreSQL 不支持 CONCAT()(9.1+ 才有,但行为和 MySQL 不同),推荐用双竖线 || 拼接,但它同样遇到 NULL 就返回 NULL。
-
COALESCE(col, '')是最常用兜底方式,比如name || ' - ' || COALESCE(phone, '') || ' - ' || email - 如果要聚合行内多列且逻辑复杂,可封装成
ARRAY[]再用array_to_string(),更易读:array_to_string(ARRAY[COALESCE(name,''), COALESCE(phone,''), COALESCE(email,'')], ' | ')
- 注意:
||优先级低于+或比较运算符,复杂表达式建议加括号
SQL Server 的 + 拼接与 ISNULL() 配合
SQL Server 用 + 拼字符串,但类型必须一致,且任一操作数为 NULL 整个结果就是 NULL。不能直接连字符和数字混用。
- 必须显式转类型:
CAST(age AS VARCHAR)或CONVERT(VARCHAR, age) - 用
ISNULL(col, '')替代COALESCE()更高效(单层判断) - 示例:
UPDATE users SET summary = ISNULL(name, '') + ' | ' + ISNULL(CAST(age AS VARCHAR), '') + ' | ' + ISNULL(email, '');
- 如果某列是
TEXT类型(已弃用),需先转VARCHAR(MAX),否则+会报错
更新前务必验证拼接逻辑和 NULL 处理
线上表一旦执行 UPDATE 就不可逆,尤其汇总列常被下游依赖。别跳过验证步骤。
- 先用
SELECT模拟拼接:SELECT id, CONCAT_WS(',', a, b, c) AS test_summary FROM t WHERE id IN (1,2,3); - 检查是否有意外的空格、换行符或不可见字符——它们可能来自原始数据,不是拼接逻辑本身的问题
- 大表更新考虑加
LIMIT(MySQL)或分批(如按主键范围),避免锁表太久 - 如果目标列是
NOT NULL,而拼接结果为NULL,语句会失败,必须确保兜底逻辑覆盖所有分支
实际拼接时,NULL 处理和类型转换才是出问题最多的地方,不是函数选错。











