oracle的split函数

   最近,根据SE需求,要把系统多余的垃圾数据清理出来,在针对事件跟子事件时;我要整理出一个表格,让SE勾选那些事件是要删除的,由于资料是拿不出来的,就定义一个零时的表;比对事件表为event表;存放4个字段;分别是:主事件ID;主事件name;子事件ID;子事件。

 但是子事件的格式是: subevent=eventname_subeventname_subeventid;

    create table event(

      eventid number,

      eventname varchar2(20),

      subeventid number,

     subevent varchar2(50)

  );

而我所需要的是subeventname;需要eventid/eventname/subeventid/subeventname;需要这些值做出一个表格!

当时;我就想oracle有个自带函数split()就好了;但oracle没有!没有就没有;我想到用函数ltrim()跟函数gtrim();

select eventid,eventname,subeventid, gtrim(ltrim(subevent,eventname||'_'),subeventid||'_') subeventname from event;

但是小高兴了一把!虽然没达到想要的效果;但是复制到execl表格;只要稍作修改就可以了;

原因是:例如subevent的值为'SMS_MO_1';得到的值是'O';而不是'MO',这个就不要我解释了吧!

还是有点遗憾!既然没有自带函数split(),那就仿照网上的split()写一个吧!(当时网上那个split()执行达不到想要的效果)

代码如下:

CREATE OR REPLACE FUNCTION split
(
    v_desc   VARCHAR,
    v_icount NUMBER
) RETURN VARCHAR IS
    v_result  VARCHAR(20);
    v_pos     NUMBER(2);
    v_str     VARCHAR(1000);
    v_count_2 NUMBER(2);
    v_word    VARCHAR(20);
BEGIN
    v_result  := '';
    v_str     := v_desc || ',,,';
    v_count_2 := 0;
    v_pos     := instr(v_str, ',');
    WHILE v_pos > 1
    LOOP
        v_count_2 := v_count_2 + 1;
        v_word    := substr(v_str, 1, v_pos - 1);
        IF v_icount = v_count_2 THEN
            v_result := v_word;
            RETURN v_result;
        ELSE
            IF v_icount < v_count_2 THEN
                RETURN '';
            ELSE
                IF v_str <> ',' THEN
                    v_str := substr(v_str, v_pos + 1);
                    v_pos := instr(v_str, ',');
                END IF;
            END IF;
        END IF;
    END LOOP;
    RETURN v_result;
END split;

例子:

  我那pl/sql函数到环境执行下;

select eventid,eventname,subeventid,split(replace(subevent,'_',','),2) subeventname from event;

这样就达到要求了;不会出现上面那条sql出现的问题!

当然我可以借用正则函数来写;也没必要去建这个split函数;前提是你的oracle系统是11G。

select eventid,eventname,subeventid,regexp_replace(subevent,'(.*)_(.*)_(.*)','\2') subeventname from event;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中没有split函数,但可以使用正则表达式或其他方法来实现字符串的拆分。以下是两种常用的方法: 1. 使用正则表达式函数REGEXP_SUBSTR 可以使用REGEXP_SUBSTR函数来提取字符串中的子串。例如,要将字符串'apple,orange,banana'按逗号分隔成三个子串,可以使用以下语句: ``` SELECT REGEXP_SUBSTR('apple,orange,banana', '[^,]+', 1, LEVEL) AS result FROM dual CONNECT BY LEVEL <= REGEXP_COUNT('apple,orange,banana', ',') + 1; ``` 其中,[^,]+表示非逗号字符的一个或多个,1表示从第一个字符开始匹配,LEVEL为循环计数器,CONNECT BY LEVEL表示循环次数。执行结果如下: ``` result ------ apple orange banana ``` 2. 使用CONNECT BY LEVEL和SUBSTR函数 可以使用CONNECT BY LEVEL和SUBSTR函数来实现字符串的拆分。例如,要将字符串'apple,orange,banana'按逗号分隔成三个子串,可以使用以下语句: ``` SELECT TRIM(SUBSTR(',' || 'apple,orange,banana', INSTR(',' || 'apple,orange,banana', ',', 1, LEVEL) + 1, INSTR(',' || 'apple,orange,banana', ',', 1, LEVEL + 1) - INSTR(',' || 'apple,orange,banana', ',', 1, LEVEL) - 1)) AS result FROM dual CONNECT BY LEVEL <= REGEXP_COUNT('apple,orange,banana', ',') + 1; ``` 其中,',' || 'apple,orange,banana'表示在字符串前添加一个逗号,INSTR函数用于查找逗号的位置,SUBSTR函数用于提取子串,TRIM函数用于去除子串两端的空格。执行结果如下: ``` result ------ apple orange banana ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值