需求背景:把 小蜜蜂(qQ1)(123)AQ12a -->> 小蜜蜂
目录:
你会选择什么方法呢?
我第一反应是使用 TRANSLATE 函数,因为他可以涵盖所有情况的情况。
语法:
translate(expr, from, to)
返回一个 expr
,其中 from
中的所有字符都替换为 to
中的字符。
expr
:一个字符串表达式。from
:包含一组要替换的字符的字符串表达式。to
:由一组要替换from
的匹配字符组成的字符串表达式。
方式一:TRANSLATE
--STEP1:去掉左右括号
select TRANSLATE(TRANSLATE('小蜜蜂(qQ1)(123)AQ12a',"\\(",'1'),"\\)",'1');
result
+------------------+
| _C0 |
+------------------+
| 小蜜蜂qQ1123AQ12a |
+------------------+
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
我是分割线
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
--STEP2:去掉数字
select TRANSLATE(TRANSLATE(TRANSLATE('小蜜蜂(qQ1)(123)AQ12a',"\\(",'1'),"\\)",'1'),'0123456789','');
result
+-------------+
| _C0 |
+-------------+
| 小蜜蜂qQAQ12 |
+-------------+
.....
后续去掉大小写字母也是同样的操作,只是在去掉数字基础上套多两层 TRANSLATE 而已。
但是后面想了想用正则表达式的 regexp_replace 似乎会更简单一点,最重要是高级一点,歪嘴.jpg。
语法:
regexp_replace(str, regexp, rep [, position] )
将 str
中与 regexp
匹配的所有子字符串都替换为 rep
。
str
:要匹配的字符串表达式。regexp
:具有匹配模式的字符串表达式。rep
:作为替换字符串的字符串表达式。position
:一个大于 0 的可选整型数字文本,指示开始匹配的位置。 默认值为 1。
方式二:regexp_replace
--STEP1去掉括号内容
SELECT regexp_replace('小蜜蜂(qQ1)(123)AQ12a','\\(.*?\\)','');
result
+------------+
| _c0 |
+------------+
| 小蜜蜂AQ12a |
+------------+
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
我是分割线
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
--STEP2去掉数字,大小写字母
SELECT regexp_replace(regexp_replace('小蜜蜂(qQ1)(123)AQ12a','\\(.*?\\)',''),'[A-Za-z0-9]','');
result
+-------+
| _c0 |
+-------+
| 小蜜蜂 |
+-------+
对比起来结果是很明显的,TRANSLATE 需要5层才能解决的问题,regexp_replace 只要两步就搞掂了,当然也并不是每种函数是这样,有时候有些函数看起来很简单,但是它底层的执行计划还是很负责的,不过正则表达式总体执行效率还行。
ps:这里用到 “ \\ “ 是带有转义的作用,老司机应该很清楚的,小白们可以了解一下。因为" ( "和” ) “ 它们在 SQL 中的使用是有点类似关键字的,所以需要用 “ \\ “ 将他们转换成类似字符串的形式这样会好处理一些。
总结:
最后也小结一下吧,虽然两种方式都能达到要求,但可以看到正则表达式 regexp_replace 的适用会更加广阔一些涵盖了所有情况,但是 TRANSLATE 也有它自己的优势可以应用于特殊的场景,定制化服务。不过还是看应用场景为主,什么函数都是,没有绝对的正确或者错误,它们其实就是工具一样,使用恰当新手也可以”屠龙“!!!