【HQL实用】如何把括号“()”去掉或者去掉括号和括号里面的内容

需求背景:把 小蜜蜂(qQ1)(123)AQ12a -->> 小蜜蜂

目录

方式一:TRANSLATE

方式二:regexp_replace 


你会选择什么方法呢?

我第一反应是使用 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  也有它自己的优势可以应用于特殊的场景,定制化服务。不过还是看应用场景为主,什么函数都是,没有绝对的正确或者错误,它们其实就是工具一样,使用恰当新手也可以”屠龙“!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值