標籤:
例子:
一個字串"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 字串分割排序冒泡演算法