oracle获取特定字符串在字符串中出现的次数-translate, regexp_count

需求一:获取字符串中特定字符逗号","在字符串",abc,,,d,,ef,"中出现的次数(共出现7次)。

需求二: 获取字符串中特定字符串“@-”在字符串“@-ab@@cd--ef@h-j”中出现的次数(工出现1次)

--------------------需求一---------------

方式一, regexp_count函数:

语法: regexp_count(source_str, target_char [, position [, match_param]])
source_str:包含特定字符的字符串
target_char:特定字符
position: 从哪个下标开始搜索,可省略,但需>=1
match_param: 正则的匹配模式参数, 'i':忽略大小写; ‘c’或不配置该参数:不忽略大小写;此外还有‘n’、‘m’、‘x’等参数。

使用oracle11g提供的regexp_count函数,直接获取特定字符在字符串中出现的次数。

select regexp_count(',abc,,,Ad,,ef,', ',') from dual;

结果如下图:

 

方式二, translate函数:

语法:translate(source_str, from_str, to_str)
source_str:待处理的字符串
from_str:需要转义的字符拼接而成的串
to_str:转义后的字符拼接而成的串
解释:
0. 三个字符串中任意一个为null,其结果都是null
1. from_str和to_str的对应关系,从左往右用一一对应, 对于在from_str中出现的重复字符, 
    且重复字符的下标在to_str该下标有值时,会同时忽略重复字符在from_str和to_str下标的值。
    既重复字符以第一次出现的替换规则为准。
2. from_str的长度大于to_str的长度时,对于from_str中多出来的字符可以理解为将其转换为空字符串。
    多于字符串中已经有转义映射关系的字符,按照之前的映射关系转义。
3. 按照转义规则替换source_str中的字符,并得到最终的结果。
(以上解释比较绕,可以简单的将from_str和to_str看做等长,长度不够的位用空字符代替,然后再转义source_str)

现将source_str中非特定字符删掉,然后再统计长度。(注意:需要在from_str前面拼接上特定字符)

删掉source_str中非特定字符的内容,如下图:

统计特定字符在source_str中出现的次数,

select length(translate(',abc,,,d,,ef,', ',' || ',abc,,,d,,ef,', ',')) from dual;

如下图:

 

方式三,组合几个函数的结果:

select length(',abc,,,d,,ef,') - length(replace(',abc,,,d,,ef,', ',','')) from dual;

如下图:

 

--------------------需求二---------------

这里不要使用translate函数, 只有极少数情况下能满足需求。

组合使用length函数,regexp_replace函数获取结果,如下图:

替换字符串中的特定字符串:

计算出现的次数:

select (length('@-ab@@cd--ef@h-j') - length(regexp_replace('@-ab@@cd--ef@h-j','@-'))) / length('@-') from dual;

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值