Oracle 字串分割排序冒泡演算法

來源:互聯網
上載者:User

標籤:

例子:

     一個字串"11,15,13,17,12",以逗號分割,現在要排序成"11,12,13,15,17"。

寫了一個實現方法,記錄下來以備後用:

---------------------------------------------------------- Export file for user BEN                           ---- Created by Administrator on 2015/8/5 星期三, 10:24:20 ----------------------------------------------------------set define offspool get_bubble.logpromptprompt Creating function GET_BUBBLEprompt ============================promptcreate or replace function Get_BUBBLE(  av_str varchar2,  --要分割的字串  av_split varchar2  --分隔字元號)return varchar2is  lv_str varchar2(1024);   str  varchar2(1024);   str1 varchar2(1024); --進行交換的第一個子串  str2 varchar2(1024); --進行交換的第二個子串  temp varchar2(1024); --臨時交換中間空間  new_str varchar2(1024); --內層迴圈每次交換的最大值  all_str varchar2(1024); --儲存每次迴圈後產生的新串  end_str varchar2(1024); --最終值,傳回值  lv_length number; --分割後的子串個數  jflag char(1); --每次外迴圈後首次內迴圈的標識  i number := 0; --外迴圈控制  j NUMBER := 0; --內迴圈控制  x number;  --首次內迴圈第一個子串截取位置  k number;  --首次內迴圈第二個子串截取位置  y number;    z number;  --非首次內迴圈子串截取的位置begin  lv_str    := ltrim(rtrim(av_str)); --去前後空格  str       := lv_str;  lv_length := 0;  ----分割串【得到子串個數】  while instr(str,av_split)<>0 loop     lv_length:=lv_length+1;     str:=substr(str,instr(str,av_split)+length(av_split),length(str));  end loop;  lv_length:=lv_length+1;   if lv_length <= 1 then    return ‘分割後只有一個子串‘;  end if;------------------------------------------------    end_str := ‘‘;  <<loop1>>  loop --外迴圈    if i < lv_length then      j := i+1;       jflag := 0;      new_str := ‘‘;      all_str := ‘‘;      <<loop2>>      loop --內迴圈        if j < lv_length then          if jflag = 0 then -- 首次內迴圈(方便處理子串的拼接問題)            select instr(lv_str, av_split, 1) into x from dual;            str1 := substr(lv_str, 1, x-1);            --decode處理最後一個子串截取位置為0的問題            select decode(instr(lv_str, av_split, x+length(av_split)),0,length(lv_str)+1,instr(lv_str, av_split, x+length(av_split))) into k from dual;            str2 := substr(lv_str, x+length(av_split), k-x-length(av_split));            select count(*) into y from dual where str1 > str2;            if y > 0 then              new_str := str1;              temp := str1;              str1 := str2;              str2 := temp;                  else              new_str := str2;            end if;            all_str := str1;             jflag := 1;          else --非首次            str1 := new_str; --上次比較後的最大值作為這次比較的前一個值            select decode(instr(lv_str, av_split, k+length(av_split)),0,length(lv_str)+1,instr(lv_str, av_split, k+length(av_split))) into z from dual;            str2 := substr(lv_str, k+length(av_split), z-k-length(av_split)); --第二個            k := z; -- z賦給k,方便下一次截取str2            select count(*) into y from dual where str1 > str2;            if y > 0 then              new_str := str1;              temp := str1;              str1 := str2;              str2 := temp;                  else               new_str := str2;            end if;            all_str := all_str||av_split||str1;           end if;        end if;        j := j+1;        exit loop2 when j >= lv_length;              end loop loop2;      lv_str := all_str||av_split||new_str; --上一輪內迴圈產生的新串            if end_str is null then --最終的子串處理        end_str := new_str;      else        end_str := new_str||av_split||end_str;      end if;              end if;    i := i+1;    exit when i >= lv_length-1;  end loop loop1;  end_str := str1||av_split||end_str; --返回前拼接上最後一個值  return  end_str;end Get_BUBBLE;/spool off

 

Oracle 字串分割排序冒泡演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.