Oracle函数应用-灵活截取字符串

作者在 2018-03-02 10:23:21 发布以下内容

前章讲到的《多维度单循环模式》中提到需要使用数据库中的拼接字符串的技术,但是当拼接字符串过长且较为复杂时拆串就会非常复杂,下面通过总结封装出一个方法

这里是以Oracle为背景总结的,同理可得其他数据库

CREATE OR REPLACE FUNCTION indchar (str1 varchar2, str2 varchar2,indexs number)  

RETURN varchar2  

AS  

    varlen1 number;--字符串总长度   
    varlen2 number;--用来存储截串用的字符串的长度
    i number;--用来记录字符串中每个字符串的位置的
    n number;--用来记录字符串中包含几个截串用的字符串
    m number;--用来记录字符串中第n个用来截串用的字符串位置
    varstr1 varchar2(200);--临时存取需截取字符串中的单个字符串
    varstr2 varchar2(200);--临时存取用于截串中的单个字符串
    varstr3 varchar2(200);--用于存储返回字符串
BEGIN  

    varlen1 := length(str1);  
    varlen2 := length(str2);
    
    i := 1; 
    n := 0;
    m := 0;
    
    --循环用来计算包含多少个截串用的字符串
    while i<= varlen1 loop 
        varstr1 := substr(str1,i,1);
        varstr2 := substr(str2,1,1);
        if varstr1 = varstr1 then
          if substr(str1,i,varlen2) = str2 then
          n:= n+1;
          end if;
        end if;
       i :=i+1;
    end loop;
     
    ------判断索引位置
    if indexs <=0 then
      return '';
     end if;
     
    --判断截取字符串个数
    if n=0 then
      return str1;
    end if;
    
   --判断索引位置
   if indexs = 1 then
     i:=1;
     n:=0;
      while i<= varlen1 loop 
          varstr1 := substr(str1,i,1);
          varstr2 := substr(str2,1,1);
          varstr3 := concat(varstr3,substr(str1,i,1));
          if varstr1 = varstr2 then
            if substr(str1,i,varlen2) = str2 then
            n:= n+1;
            return substr(varstr3,1,m-2);
            end if;
          end if;
         i :=i+1;
      end loop; 
    end if;
    if indexs <= n+1 then
    -------
     i:=0;
     n:=0;
      while i<= varlen1 loop 
          varstr1 := substr(str1,i,1);
          varstr2 := substr(str2,1,1);
          --varstr3 := concat(varstr3,substr(str1,i,1));
          if varstr1 = varstr2 then
            if substr(str1,i,varlen2) = str2 then
            n:= n+1;
            m:= i+1;
            --return substr(varstr3,1,m-2);
            end if;
          end if;
          if n+1 = indexs then
              varstr3 := concat(varstr3,substr(str1,i,1));
               
            end if;
            if n+1 > indexs then
                return substr(varstr3,length(str2)+1,length(varstr3)-length(str2));
            end if;
         i :=i+1;
      end loop; 
    -------
    end if;
    ----获取拆分后的最后一个字符串
    return substr(varstr3,length(str2)+1,length(varstr3)-length(str2)+1);
END;  
--调用函数参数说明:
--num_char(str1 varchar2,str2 varchar2,indexs number)
--str1 原字符串
--str2 拆分字符串
--index 字符串个数索引


下面获取拆分字符串中最后一个字符串


--查询语句:select num_char('ws++rq++sl++dl','++',4) from dual
--返回结果:dl


********转载或引用需标明出处************

oracle | 阅读 4171 次
文章评论,共4条
者下时女(游客)
2018-07-02 22:47
1
mooncharmzx(作者)
2019-03-07 11:21
2
以下是引用者下时女在2018-07-02 22:47的发言1

测试过了,好像不能用啊
用的oracle数据库吗?
师八而看(游客)
2021-07-18 11:48
3
6666
什印散控(游客)
2022-09-02 19:56
4
编译错误
错误:PLS-00103: 出现符号 "WHILE"在需要下列之一时:        %
行:26
文本:while i<= varlen1
游客请输入验证码