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;