博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 字符串分割排序冒泡算法
阅读量:6094 次
发布时间:2019-06-20

本文共 3554 字,大约阅读时间需要 11 分钟。

例子:

     一个字符串"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 := '';  <
> loop --外循环 if i < lv_length then j := i+1; jflag := 0; new_str := ''; all_str := ''; <
> 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

 

转载于:https://www.cnblogs.com/benbenduo/p/4704239.html

你可能感兴趣的文章
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
腰围2尺1,2,3,4,5,6,7,8寸各自等于是多少厘米/英寸(对比表)
查看>>
kFreeBsd 国内开源镜像站汇总
查看>>
用PYTHON实现将电脑里的所有文件按大小排序,便于清理
查看>>
网页动态切换母版页(MasterPage)
查看>>
几种常见模式识别算法整理和总结
查看>>
iOS开发UI篇—Quartz2D使用(矩阵操作)
查看>>
设计模式初学者笔记:Abstract Factory模式
查看>>
Hrbust1328 相等的最小公倍数 (筛素数,素因子分解)
查看>>
推荐一个内容滚动jquery插件
查看>>
淘宝的几个架构图
查看>>
Warning: Divide by zero.
查看>>
[Android Studio] Android Studio移除的Module如何恢复(转载)
查看>>
蝶若双生,花便盛开
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
JAVA数组的定义及用法
查看>>
充分利用HTML标签元素 – 简单的xtyle前端框架
查看>>