说到字符串替换功能函数,大家都会不约而同地想到 replace 函数,毕竟 replace 函数在各种语言中都是由应用,且比较容易理解;在Impala中,还有一个字符串替换函数 translate,也可以用于做函数替换,只是用法上有一些区别,有些场景下比replace更好用,有些场景下只能用replace
replace 函数与 translate 函数都是可以用来做字符串替换的,功能比较相似,但又有所区别:、
replace 是对整个字符替换为指定的字符,强调一整个替换字符;
translate 是将逐个位置的字符对应替换成对应位置的字符,强调逐个字符进行对应替换;
所以,在单个字符替换的场景下,其实 repalce 和 translate 的效果是一样的;在多个字符的替换的场景下,二者又是有所区别的
函数区别说明单纯用文字可能不好理解,我们先说明一下各自的用法:
序号 | 语法类型/方法名称 | 输出类型 | 使用说明 |
1 | replace(str, 'ab', 'cd') | str | 将str中所有整串的 'ab',替换为整串的 'cd' |
2 | replace(str, 'ab', 'cd') | str | 将str中所有的 'a' 替换为 'c',所有的 'b'替换为 'd',不考虑是否相连 |
有了上面的用法说明,相信大家就有点眉目了,那我们就来一起蠢蠢欲试吧,用几个示例来看看 replace 和 translate 的实际区别
-- replace替换整串的字符
select replace('hello world','wo','ni')
-- 输出:hello nirld
-- translate逐个替换字符
select translate('hello world','wo','ni')
-- 输出:helli nirld
-- translate逐个替换字符,函数右侧替换个数不匹配,则用空串补充
select translate('hello world','wo','n')
-- 输出:hell nrld
select translate('hello world','w','ni')
-- 输出:hello norld
上面的示例很明显,replace 是进行整串字符串的替换,如果是单个字符的替换,那么 replace 和 translate 的效果是一致的;如果是多个字符的替换,那么二者的效果根据不同情况,会有不同;
如下标红所示,就是区别点:
需求 | SQL | 输出结果 |
单个字符替换 | select replace('hello world','l','L') | heLLo worLd |
select translate('hello world','l','L') | ||
多个字符替换 | select replace('hello world','or','OR') | hello wORld |
select translate('hello world','or','OR') | hellO wORld |
那么,在单个字符替换的场景下,如果我们需要进行多次单个字符替换,即多层replace 嵌套的时候,我们可以用translate 来解决我们的需求,避免多层嵌套,降低解读成本,简化代码量;当然,如果是多个字符替换的场景下,依然要用replace 来完成需求,即使需要多层嵌套
以上就是 Impala 中 replace 函数和 translate 函数的用法和区别,大家在实际项目中,可以根据场景自行选择适合的函数进行使用,希望对大家有帮助