select * from table where ziduan like '%公司%'; 查找table表里,ziduan字段包含“公司”字符的记录
create or replace procedure IsLike(strA in varchar2,strB in varchar2,blnisLike out number) is begin blnislike:=0; if strA=strB then blnislike:=1; return; end if; if instr(strA,strB)>0 then blnislike:=1; return; end if;
if instr(strB,strA)>0 then blnislike:=1; return; end if;
if strA中和strB中字符联系相等的个数超过了strA的长度的一半或2/3 并且超过了strB的长度的一半或1/3 then blnislike:=1; return; end if;end; /
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; /
查找table表里,ziduan字段包含“公司”字符的记录
is
begin
blnislike:=0; if strA=strB then
blnislike:=1;
return;
end if; if instr(strA,strB)>0 then
blnislike:=1;
return;
end if;
if instr(strB,strA)>0 then
blnislike:=1;
return;
end if;
if strA中和strB中字符联系相等的个数超过了strA的长度的一半或2/3 并且超过了strB的长度的一半或1/3 then
blnislike:=1;
return;
end if;end;
/
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;
/
我以為可以把字符數少的那個字串先拿出來,然後分兩步來對比:
假設有字串A、字串B,其中Length(A)<=Length(B),那麼設置S:=A,
第一步
每次從S的後面去掉一個字符,然後把去掉字符後的字串跟B比較,看是否全部包含在B中,當發現包含時跳出循環,並作個標志,其值為TRUE;
第二步
每次從S的前面去掉一個字符,然後把去掉字符後的字串跟B比較,看是否全部包含在B中,當發現包含時跳出循環,並作另一個標志,其值為TRUE;如果兩步中的標志值都是TRUE,則可以近似的認為兩個字符串相似,如果認為上述判斷還不夠近似的話,則還可以同時再加其它的判斷,如樓上所給的代碼。
1。“中国工商银行杭州市分行”与“工商银行杭州市分行庆春支行”
这里你可以查"%工商银行杭州市分行%"
2。“浙江省开元房地产开发有限公司”与“开元房地产开发公司”
这里你可以查"%开元房地产%"