前章讲到的《多维度单循环模式》中提到需要使用数据库中的拼接字符串的技术,但是当拼接字符串过长且较为复杂时拆串就会非常复杂,下面通过总结封装出一个方法
这里是以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
原文在编程论坛:
********转载或引用需标明出处************