Oracle 拆分字符串 + 字符串指定字符个数统计

Oracle 同时被 3 个专栏收录
2 篇文章 0 订阅
3 篇文章 0 订阅
2 篇文章 0 订阅

regexp_substr函数

regexp_substr(srcstr, pattern, position, occurrence, modifier)

-srcstr:需要处理的字符串;
-pattern:正则表达式;
-position:起始位置,从第几个字符开始正则表达式匹配。默认为1;
-occurrence:标识第几个匹配组,默认为1;
-modifier:'i’不区分大小写检索;‘c’区分大小写检索。默认为’c’ 。

occurrence设为level,会得到分割后的所有结果。level是oracle的关键字,表示查询深度,用来实现层级查询。

统计字符串指定字符个数

length(v_numlist) - length(replace(v_numlist, ',', ''))

v_numlist是原字符串,求出逗号的个数
通过求出原字符串长度和删除指定字符的字符串长度,相减获得统计个数

模拟split拆分检索

假设表tab1中仅有一行记录,内容如下:

NumlistNumPosi
23,56,90,543,9191

其中Posi列的值为空
求Num列的数字在Numlist列中第一次出现时是第几个数字,并把结果更新到Posi列中。如果找不到,则写-1。
例如,当Numlist = ‘23,56,90,543,91’,Num = 91时,Posi = 5;
当Numlist = ‘23,56,90,543,91’,Num = 54时,Posi = -1。
注意:尽管543中有54这个数字,但并不认为54出现过。

根据这些条件,使用字符串拆分或许是最快的办法。

drop table tab1;
create table tab1(
    numlist varchar2(30),
    num varchar2(30),
    posi number
);
insert into tab1 values('23,56,90,543,91', '91', null);

set serveroutput on
declare
    v_numlist tab1.numlist % type;
    v_num tab1.num % type;
    v_posi number;
begin
    select numlist, num
    into v_numlist, v_num
    from tab1;
    
    select index_level
    into v_posi
    from (
        select regexp_substr(v_numlist, '[^,$]+', 1, level) str, level index_level
        from dual
        connect by level <= length(v_numlist) - length(replace(v_numlist, ',', '')) + 1
    )
    where str = v_num and rownum <= 1;
    update tab1 set posi = v_posi where num = v_num;
    exception
        when no_data_found then 
            update tab1 set posi = -1 where num = v_num;
end;
/
select * from tab1;

注意一点,统计是统计指定字符个数,拆分后的字符串个数是统计值+1
所以,level <= length(v_numlist) - length(replace(v_numlist, ‘,’, ‘’)) + 1

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

雲帝

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值