create or replace function islike(strA in varchar2,strB in varchar2) return number
is
lenA number(7):=0;
lenB number(7):=0;
stringA varchar2(4000):='';
stringB varchar2(4000):='';
strTemp varchar2(4000):='';
i number(7):=0;
cnt number(7):=0;
begin
if strA is null or strB is null then
return 0;
end if;
--计算长度
lenA :=length(strA);
lenB :=length(strB);
--剔除两个字符串中的重复字符
stringA:=substr(strA,1,1);
for i in 2..lenA loop
if nvl(instr(stringA,substr(strA,i,1)),0)=0 then
stringA:=stringA||substr(strA,i,1);
end if;
end loop;
stringB:=substr(strB,1,1);
for i in 2..lenB loop
if nvl(instr(stringB,substr(strB,i,1)),0)=0 then
stringB:=stringB||substr(strB,i,1);
end if;
end loop;
--换位,确保 stringA 是较长的那个
if length(stringB)>length(stringA) then
strTemp:=stringA;
stringA:=stringB;
stringB:=strTemp;
end if;
--重新计算长度
lenA :=length(stringA);
lenB :=length(stringB);
--认为相同字符个数过半数才可能相似
if lenB<ceil(lenA/2) then
return 0;
end if;
if stringA=stringB or instr(stringA,stringB)>0 then
return 1;
end if;
cnt :=0;
for i in 1..lenB loop
if instr(stringA,substr(stringB,i,1))>0 then
cnt:=cnt+1;
end if;
end loop;
if cnt<ceil(lenA/2) then
return 0;
else
return 1;
end if;
end;
/