REPLACE函数是字符串替换函数,语法为REPLACE(string, old_substring, new_substring),不修改原数据,对NULL值返回NULL,区分大小写且不支持正则。

REPLACE 函数能直接在 SELECT 中修改字段值,但不改变原数据,且对 NULL 值返回 NULL —— 这是多数人第一次用就翻车的地方。
REPLACE 函数的基本用法和常见错误
SQL 的 REPLACE 是字符串替换函数,语法为 REPLACE(string, old_substring, new_substring)。它不会修改表中数据,只影响查询结果。
- 如果被替换字段是
NULL,整个表达式结果就是NULL,不是原字符串;需要配合COALESCE或ISNULL处理 -
old_substring区分大小写(取决于数据库排序规则,如 MySQL 默认 case-insensitive,SQL Server 取决于 collation) - 不支持正则,只能做精确子串替换;想替换多个不同字符串得嵌套调用或用
CASE WHEN - 在 WHERE 子句中用
REPLACE会导致索引失效,慎用于大表过滤
MySQL 和 PostgreSQL 中的兼容性差异
基本语法一致,但 NULL 处理和空字符串行为略有不同:
- MySQL:若
old_substring为空字符串(''),REPLACE报错或返回原字符串(5.7+ 返回原字符串,8.0+ 允许但不推荐) - PostgreSQL:严格要求
old_substring非空,传入''会报错ERROR: zero-length replacement string - 两者都支持对列名、常量、表达式结果调用,例如:
REPLACE(title, 'Mr.', 'Mister')
实战场景:清理脏数据并避免意外截断
比如用户昵称字段混入了不可见字符(如 \r\n、全角空格),或统一缩写('USA' → 'United States'):
SELECT id, REPLACE(REPLACE(nickname, '\r\n', ' '), ' ', ' ') AS cleaned_nickname, -- 先换行再全角空格 REPLACE(country_code, 'USA', 'United States') AS country_name FROM users WHERE nickname IS NOT NULL;
- 多层
REPLACE顺序很重要:先处理换行再处理空格,否则可能残留多余空格 - 别在 UPDATE 语句里盲目套用——确认好条件,加
WHERE限制范围,否则整列被误改 - 执行前先用
SELECT预览效果,尤其注意长度变化是否导致VARCHAR截断(新字符串比原串长时)
替代方案:什么时候不该硬上 REPLACE
当需求超出简单子串替换时,REPLACE 就力不从心了:
- 要替换所有数字为
*?→ 用正则函数:REGEXP_REPLACE(PostgreSQL / MySQL 8.0+)或TRANSLATE(Oracle / PostgreSQL) - 要按规则批量修正地址格式?→ 先导出数据用 Python/awk 处理,再回写,比纯 SQL 更可控
- 想把 “apple,banana,orange” 拆成三行?→
REPLACE做不了,得用递归 CTE 或字符串拆分函数
真正麻烦的从来不是怎么写那行 REPLACE,而是没想清楚原始数据到底有多脏、替换后业务逻辑是否还成立。

















