oracle 有一个发音相似函数soundex,倒没有听说有语义相似函数。

解决方案 »

  1.   

    楼主的问题属于中文分词功能,只要到www.google.com搜索下“中文分词”就知道了。
      

  2.   

    select * from table where ziduan like '%公司%';
    查找table表里,ziduan字段包含“公司”字符的记录
      

  3.   

    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;
    /
      

  4.   

    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;
    /
      

  5.   

    支持 boydgmx(梦霄) 的做法。
    我以為可以把字符數少的那個字串先拿出來,然後分兩步來對比:
    假設有字串A、字串B,其中Length(A)<=Length(B),那麼設置S:=A,
    第一步
    每次從S的後面去掉一個字符,然後把去掉字符後的字串跟B比較,看是否全部包含在B中,當發現包含時跳出循環,並作個標志,其值為TRUE;
    第二步
    每次從S的前面去掉一個字符,然後把去掉字符後的字串跟B比較,看是否全部包含在B中,當發現包含時跳出循環,並作另一個標志,其值為TRUE;如果兩步中的標志值都是TRUE,則可以近似的認為兩個字符串相似,如果認為上述判斷還不夠近似的話,則還可以同時再加其它的判斷,如樓上所給的代碼。
      

  6.   

    用oracle的通配符%和_
    1。“中国工商银行杭州市分行”与“工商银行杭州市分行庆春支行”
    这里你可以查"%工商银行杭州市分行%"
    2。“浙江省开元房地产开发有限公司”与“开元房地产开发公司”
    这里你可以查"%开元房地产%"