oracle中的分割字符串,并求最大值

来源:互联网 发布:he111轰炸机数据 编辑:程序博客网 时间:2024/06/10 08:45

今天公司做一个 oracle中的分割字符串,并求最大值,在C# 或其它语言中都会有一个类似于split的函数,而在oracle中是没有这样现成的,不过可以通过instr和substr组合实现类似于split的功能。

我来介绍一个我们的需求:有一个clog的字段,字段内容如“4.01,101.20;4.19,100.00;4.36,97.10;4.52,95.90;4.66,96.90;4.80,99.00;4.92,99.80;5.03,99.10;5.14,96.90;5.19,96.20;5.28,96.10;5.35,97.10;5.40,98.10;5.43,97.80;5.46,96.60;5.45,93.20;5.42,92.20;5.36,92.00;5.27,91.80;5.14,91.70;5.00,90.10;4.83,87.20;4.65,83.70;4.44,78.90;4.22,73.30;3.99,67.90;3.76,60.90;3.60,56.80;3.36,58.50;3.11,63.00;2.86,67.20;2.61,67.40;2.37,62.30;2.14,59.40;1.91,58.50;1.68,62.30;1.46,65.00;1.25,66.00;1.05,64.30;0.87,61.60;0.70,60.60;0.55,63.00;0.42,64.80;0.30,67.20;0.20,66.20;0.15,65.00;0.09,64.00;0.05,64.30;0.04,67.00;0.06,70.10;0.11,70.40;0.18,72.30;0.28,75.70;0.40,78.90;0.49,81.10;0.63,87.20;0.81,92.50;0.99,96.90;1.19,102.90;1.40,107.60;1.62,103.70;1.83,99.00;2.06,94.40;2.29,96.20;2.51,99.60;2.72,103.20;2.94,102.20;3.15,98.80;3.34,95.60;3.53,95.60;3.71,98.30;3.90,100.50;”

其实它存放的是一组坐标值,如(4.01,101.20)(x,y),它们这间是由“;”分开的,我们在取出这一组值中最大的

一个Y轴的值。

解决方法:

用INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)来定位“;”的位置,

用substr(源字符串,起始位置,终址位置)来取得在两个“;”这间的坐标,

最后有类似的方法取出Y轴的值,最后返回。

以下是我写的一个FUN

create or replace function F_GetMaxNumber(obj in clob,firstSplitChar in char,secondSplitChar in Char)
/*
 功能:求最大Y坐标
 编写开始日期:2007年8月21日
 参数数据项定义:obj一个施工图中的坐标字符串,firstSplitChar第一个分割符,secondSplitChar第二个分割符;
 */
return number is
Result number:=0; /*返回值是一个整数*/
str clob;
str1 clob;
j binary_integer;
jj binary_integer;
k number:=1;
i number;
ii number;
returnmax number:=0;
temp number:=0;
begin
str:=obj;
str:=trim(str);/*清除空格*/
/*以下是做循环*/
loop
/*取出第一个以firstSplitChar分割字符串*/
if(k=1) then
  j:=INSTR(str,firstSplitChar,1,1);
  str1:=substr(str,1,j-1);
else
/*取出其它以firstSplitChar分割字符串*/
    j:=INSTR(str,firstSplitChar,1,k);
    jj:=INSTR(STR,firstSplitChar,J+1,1);
    str1:=substr(str,j+1,jj-j-1);
end if;
    i:=length(str1);
    /*在以secondSplitChar分割后比较Y坐标的大小,用returnmax来记录最大值*/
    ii:=Instr(str1,secondSplitChar,1,1);
    temp:=to_number(to_char(substr(str1,ii+1,i)));
if (temp>returnmax) then
   returnmax:=temp;/*比较,returnmax中放比较大的那个数,比到最后它就是最大的*/
end if;
k:=k+1;
exit when j=length(str);
end loop;
 Result:=returnmax;
return(Result);
end F_GetMaxNumber;

原创粉丝点击