• 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;
  • 相关阅读:
    Spring4+SpringMVC+MyBatis登录注册详细
    Spring MVC登录注册以及转换json数据
    MyBatis+mysql查询和添加数据
    html5中的选择器
    倒影(转)
    bi包
    函数作用域
    节点开始
    window.onload中失效的问题
    Node.js简介
  • 原文地址:https://www.cnblogs.com/lottu/p/2990214.html
Copyright © 2020-2023  润新知