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;

 

 

posted @ 2013-04-04 21:05  lottu  阅读(3550)  评论(0编辑  收藏  举报