zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    Oracle函数如何把符串装换为小写的格式
    Oralce中的synonym同义词
    JS中getYear()的兼容问题
    How to do SSH Tunneling (Port Forwarding)
    所谓深度链接(Deep linking)
    upload size of asp.net
    发一个自动刷网站PV流量的小工具
    解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示"The operation could not be completed." 的问题。
    在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录
    使用SQL语句获取Sql Server数据库的版本
  • 原文地址:https://www.cnblogs.com/lottu/p/2990214.html
Copyright © 2011-2022 走看看