REPLACE 替换全部匹配的子串
REPLACE(str, old, new) 把 str 中所有 old 子串替换成 new,按普通字符匹配,不是正则。七个引擎都同名支持,任一参数为 NULL 时返回 NULL。要注意 StarRocks 3.0 之前按正则实现,Spark 允许省略第三个参数。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | REPLACE(str, old, new) | MaxCompute 2.0 扩展函数。只替换与 old 完全重合的部分,没有匹配时返回原字符串,任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Hologres | 支持 | REPLACE(str, old_str, new_str) | 参数和返回值都是 TEXT。 | 官方文档 |
| StarRocks | 支持 | REPLACE(str, pattern, repl) | 3.0 起按普通字符匹配,区分大小写。3.0 之前按 regexp_replace 实现。任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Doris | 支持 | REPLACE(str, old, new) | 替换全部匹配,区分大小写。old 为空字符串时返回原字符串,任一参数为 NULL 时返回 NULL。 | 官方文档已实测 4.1.5 |
| Hive | 支持 | replace(string A, string OLD, string NEW) | Hive 1.3.0 和 2.1.0 起提供,替换所有不重叠的匹配,例如 replace('ababab', 'abab', 'Z') 返回 'Zab'。 | 官方文档已实测 4.2.1 |
| Spark SQL | 支持 | replace(str, search[, replace]) | Spark 2.3.0 起提供。第三个参数可以省略,省略或为空字符串时直接删除 search。 | 官方文档 |
| Flink SQL | 支持 | REPLACE(string1, string2, string3) | 替换所有不重叠的匹配,例如 REPLACE('ababab', 'abab', 'z') 返回 'zab'。 | 官方文档已实测 2.3.0 |
迁移注意事项
- StarRocks 3.0 之前的 replace 按 regexp_replace 实现,第二个参数会被当成正则。例如替换 '.' 时会匹配任意字符。从老版本迁移时要检查含 .、*、( 等字符的用法。
- Spark 的 replace 可以只写两个参数来删除子串,其他引擎必须写三个参数。从 Spark 迁出时要补上空字符串 ''。
- Hive 1.3.0 之前没有 replace,老集群只能用 regexp_replace,并且要转义正则特殊字符。
- 需要按正则替换时改用 REGEXP_REPLACE。REPLACE 只做普通字符匹配,并且区分大小写。
示例
去掉手机号中的横线
SELECT REPLACE('138-0000-1234', '-', ''); -- 13800001234SELECT REPLACE('138-0000-1234', '-', ''); -- 13800001234SELECT REPLACE('138-0000-1234', '-', ''); -- 13800001234SELECT REPLACE('138-0000-1234', '-', ''); -- 13800001234SELECT replace('138-0000-1234', '-', ''); -- 13800001234SELECT replace('138-0000-1234', '-'); -- 13800001234SELECT REPLACE('138-0000-1234', '-', ''); -- 13800001234