作者在 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
********转载或引用需标明出处************