1.把道路通名不同的列为满足判断条件里面。
    道路通名(路、街、巷、弄、胡同、大街、道、大道)我们在判断的时候认为括号里面的通名是等价的,例如 曙光路——曙光街 判断的时候我们认为他们同一条路!
2.把方位词不同或多一个方位词的也列为满足判断条件里面。
    方位词(东、南、西、北、中)在判断的时候也认为括号里面的是等价的,例如:白云东路——白云中路;联纺路——联纺东路,要在道路通名(路、街、巷、弄、胡同、大街、道、大道)前面的方位词 我也写了个简单的(结果不对),但是没得什么思路,大家明白意思就好:
 
  create or replace function IsEqual_Fun
(
    Address1 in varchar2,
    Address2 in varchar2
)
return integer
is
commen_str3 varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道|东|南|西|北|中';
begin
    if regexp_instr(Address1,commen_str3) >=2 and regexp_instr(Address2,commen_str3 >= 2 then
        if SUBSTR(Address1,1,regexp_instr(Address1,commen_str3)) = SUBSTR(Address2,1,regexp_instr(Address2,commen_str3)) then
            return 1; 
        else
            return 0;
        end if;
    else
        return 0;
    end if;
end;

解决方案 »

  1.   

    写个function过滤掉路、街、巷、弄、胡同、大街、道、大道、东、南、西、北、中这些字符然后再比较
      

  2.   

    create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return varchar2
    is
    commen_str3 varchar2(200) := '路|大街|大道|街|巷|弄|胡同|道';
    commen_str4 varchar2(200) := '东|南|西|北|中';
    var_1 varchar2(200);
    var_2 varchar2(200);
    begin
        if regexp_instr(Address1,commen_str3) >=2 and regexp_instr(Address2,commen_str3) >= 2 then
    begin
            if SUBSTR(Address1,1,regexp_instr(Address1,commen_str3)) = SUBSTR(Address2,1,regexp_instr(Address2,commen_str3)) then
                return '1'; 
            else
        begin
        var_1 := REGEXP_REPLACE(Address1,commen_str3);
        var_2 := REGEXP_REPLACE(Address2,commen_str3);
        
        if (SUBSTR(var_1,1,regexp_instr(var_1,commen_str4)) = SUBSTR(var_2,1,regexp_instr(var_2,commen_str4))) then
    return '1'||var_1||var_2;
        elsif (REGEXP_REPLACE(var_1,commen_str4)=REGEXP_REPLACE(var_2,commen_str4)) then
    return '1'||var_1||var_2;
        else
                    return '0'||var_1||var_2;
        end if;
        end;
            end if;
    end;
        else
            return '0';
        end if;
    end;
    /
     select IsEqual_Fun('长沙南大道','长沙中街') from dual;
      

  3.   

    create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return integer
    is
    commen_str3 varchar2(200) := '路|大街|大道|街|巷|弄|胡同|道';
    commen_str4 varchar2(200) := '东|南|西|北|中';
    var_1 varchar2(200);
    var_2 varchar2(200);
    begin
        if regexp_instr(Address1,commen_str3) >=2 and regexp_instr(Address2,commen_str3) >= 2 then
    begin
            if SUBSTR(Address1,1,regexp_instr(Address1,commen_str3)) = SUBSTR(Address2,1,regexp_instr(Address2,commen_str3)) then
                return 1; 
            else
        begin
        var_1 := REGEXP_REPLACE(Address1,commen_str3);
        var_2 := REGEXP_REPLACE(Address2,commen_str3);
        
        if (SUBSTR(var_1,1,regexp_instr(var_1,commen_str4)) = SUBSTR(var_2,1,regexp_instr(var_2,commen_str4))) then
    return 1;
        elsif (REGEXP_REPLACE(var_1,commen_str4)=REGEXP_REPLACE(var_2,commen_str4)) then
    return 1;
        else
                    return 0;
        end if;
        end;
            end if;
    end;
        else
            return 0;
        end if;
    end;
    /
     select IsEqual_Fun('长沙南大道','长沙中街') from dual;
      

  4.   

    SQL>  select IsEqual_Fun('长沙南大道','长沙中街') from dual;ISEQUAL_FUN('长沙南大道','长沙中街')
    ------------------------------------
                                       1SQL>
    SQL>  select IsEqual_Fun('长沙河南大道','长沙中街') from dual;ISEQUAL_FUN('长沙河南大道','长沙中街')
    --------------------------------------
                                         0SQL>  select IsEqual_Fun('长道','长沙中街') from dual;ISEQUAL_FUN('长道','长沙中街')
    ------------------------------
                                 0SQL>  select IsEqual_Fun('长沙路道','长沙中街') from dual;ISEQUAL_FUN('长沙路道','长沙中街')
    ----------------------------------
                                     1SQL>  select IsEqual_Fun('长沙路','长沙中街') from dual;ISEQUAL_FUN('长沙路','长沙中街')
    --------------------------------
                                   1
      

  5.   

    用正则表达式,强
    regexp_instr
      

  6.   

    create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return integer
    is
    commen_str3 varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道';
    commen_str4 varchar2(200) := '东|南|西|北|中';
    begin
    if regexp_replace(address1,commen_str3,'#',2)=regexp_replace(address2,commen_str3,'#',2)
      and regexp_replace(address1,commen_str4,'#',2)=regexp_replace(address2,commen_str4,'#',2)
    then return 1;
    else return 0;
    end if;
    end;
      

  7.   

    错了
    create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return integer
    is
    commen_str3 varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道';
    commen_str4 varchar2(200) := '东|南|西|北|中';
    begin
    if regexp_replace(regexp_replace(address1,commen_str3,'#',2),commen_str4,'*',2)
      =regexp_replace(regexp_replace(address2,commen_str3,'#',2),commen_str4,'*',2)
    then return 1;
    else return 0;
    end if;
    end;
      

  8.   


    [TEST@ora10gr1#2009-11-24/21:12:06] SQL>create or replace function IsEqual_Fun
      2  (
      3      Address1 in varchar2,
      4      Address2 in varchar2
      5  )
      6  return integer
      7  is
      8  commen_str3 varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道';
      9  commen_str4 varchar2(200) := '东|南|西|北|中';
     10  commen_str3_tmp varchar2(200) := regexp_replace(regexp_replace(Address1,commen_str3,''),commen_str4,'');
     11  commen_str4_tmp varchar2(200) := regexp_replace(regexp_replace(Address2,commen_str3,''),commen_str4,'');
     12  begin
     13      if commen_str3_tmp = commen_str4_tmp then
     14          return 1;
     15      else
     16          return 0;
     17      end if;
     18  end;
     19  /Function created.[TEST@ora10gr1#2009-11-24/21:12:06] SQL>
    [TEST@ora10gr1#2009-11-24/21:12:06] SQL>select IsEqual_Fun('大大南大道','大大中街') from dual;ISEQUAL_FUN('大大南大道','大大中街')
    ------------------------------------
                                       1[TEST@ora10gr1#2009-11-24/21:12:06] SQL>select IsEqual_Fun('大大南大道','大大A街') from dual;ISEQUAL_FUN('大大南大道','大大A街')
    -----------------------------------
                                      0[TEST@ora10gr1#2009-11-24/21:12:06] SQL>直接replace就ok了。
      

  9.   


    [TEST@ora10gr1#2009-11-24/21:12:06] SQL>create or replace function IsEqual_Fun
      2  (
      3      Address1 in varchar2,
      4      Address2 in varchar2
      5  )
      6  return integer
      7  is
      8  commen_str3 varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道';
      9  commen_str4 varchar2(200) := '东|南|西|北|中';
     10  commen_str3_tmp varchar2(200) := regexp_replace(regexp_replace(Address1,commen_str3,''),commen_str4,'');
     11  commen_str4_tmp varchar2(200) := regexp_replace(regexp_replace(Address2,commen_str3,''),commen_str4,'');
     12  begin
     13      if commen_str3_tmp = commen_str4_tmp then
     14          return 1;
     15      else
     16          return 0;
     17      end if;
     18  end;
     19  /Function created.[TEST@ora10gr1#2009-11-24/21:12:06] SQL>
    [TEST@ora10gr1#2009-11-24/21:12:06] SQL>select IsEqual_Fun('大大南大道','大大中街') from dual;ISEQUAL_FUN('大大南大道','大大中街')
    ------------------------------------
                                       1[TEST@ora10gr1#2009-11-24/21:12:06] SQL>select IsEqual_Fun('大大南大道','大大A街') from dual;ISEQUAL_FUN('大大南大道','大大A街')
    -----------------------------------
                                      0[TEST@ora10gr1#2009-11-24/21:12:06] SQL>直接replace就ok了。
      

  10.   

    直接replace成空不够准确
    你试试select IsEqual_Fun('大大南大道','大北大路') from dual
      

  11.   


    确实是这样,但是北大路不符合命名规则呀,没有大路这个道路通名呀。另外补充给楼主一句,你写的之所以不好用的原因是:
    1、没有把【'路|街|巷|弄|胡同|大街|道|大道'】和【'东|南|西|北|中'】分开考虑
    2、得到的【regexp_instr(Address1,commen_str3)】是第一个匹配成功的字符位置,如:
       regexp_instr('北京大街','路|街|巷|弄|胡同|大街|道|大道') = 3,这个时候substr的话应该是1到3-1
    还有我写的代码可以做如下调整:create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return integer
    is
    commen_str varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道|'东|南|西|北|中';
    Address1_tmp varchar2(200) := regexp_replace(Address1,commen_str,'');
    Address2_tmp varchar2(200) := regexp_replace(Address2,commen_str,'');
    begin
        if Address1_tmp = Address2_tmp then
            return 1;
        else
            return 0;
        end if;
    end;
    /
      

  12.   


    create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return integer
    is
    commen_str varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道|东|南|西|北|中';
    Address1_tmp varchar2(200) := regexp_replace(Address1,commen_str,'');
    Address2_tmp varchar2(200) := regexp_replace(Address2,commen_str,'');
    begin
        if Address1_tmp = Address2_tmp then
            return 1;
        else
            return 0;
        end if;
    end;
    /
    这手呀!哎 
      

  13.   


    --想了想,虽然楼主的数据没有#14楼说的情况,还是改成下面这样保险,也再次感谢#14楼的提醒
    create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return integer
    is
    commen_str varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道|东|南|西|北|中';
    Address1_tmp varchar2(200) := regexp_replace(Address1,commen_str,'*');
    Address2_tmp varchar2(200) := regexp_replace(Address2,commen_str,'*');
    begin
        if Address1_tmp = Address2_tmp then
            return 1;
        else
            return 0;
        end if;
    end;
    /
      

  14.   

    ...就是因为没有大路这个匹配名才能说明问题
    在你写的函数中'前进路'和'路前进'和'前路进'都是一样的。这就是replace成''的缺点
    还有楼主的代码中体现了对一个问题的考虑:路|大街|街.....如果是在字符串的头部不进行转换处理
    比如 '巷子路' 和 '弄子路' 不应该返回1.我10楼写的大体上跟你的没什么区别,就是多考虑了这两个地方
      

  15.   

    看了以上各位的思路,我很受教,比我强很多倍啊!
    4L,思路是可以的,这个也是这个问题的核心。但是可能出现幸福路,幸福大街11号,你并没有考虑。
    5L,思路比较完整,但是regexp_instr(Address2,commen_str3)截取的时候,长度应该-1.
    8L,我也是新手,感谢~
    9L,与4L核心思想一致,数据可能有点复杂,我并未说明,抱歉。
    12L,方法最简单,但是缺少长度的验证,比如截取的字符串若太短,就不能让其进行比较。
    另外,commen_str其实关键字和方位词原来是分开的,我原来是commen_str1和commen_str2的,能明察秋毫,佩服。
    这个是我写的,还没大量测试的,大家可以看一下,问题在哪里。create or replace function IsEqual_Fun
    (
        Address1 in varchar2,
        Address2 in varchar2
    )
    return integer
    is
    commen_str1 varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道';
    commen_str2 varchar2(200) := '东|南|西|北|中';
    --commen_str3 varchar2(200) := '路|街|巷|弄|胡同|大街|道|大道|东|南|西|北|中';
    Address1_temp varchar2(200) ;
    Address2_temp varchar2(200);
    Address1_index number :=regexp_instr(Address1,commen_str1);
    Address2_index number :=regexp_instr(Address2,commen_str1);
     flag boolean := false;
    begin
        if Address1_index >=3 and Address2_index >= 3 then
              Address1_temp := SUBSTR(Address1,1,Address1_index-1);
              Address2_temp := SUBSTR(Address2,1,Address2_index-1);
              if Address1_temp = Address2_temp then
                  return 1; 
              else 
                  if length(Address1_temp) > length(Address2_temp) or length(Address1_temp) < length(Address2_temp) then
                     flag := true;
                  else
                     return 0;
                  end if;
                  if flag = true then
                     if SUBSTR(Address1_temp,1,regexp_instr(Address1,commen_str2)-1) = Address2_temp or
                        SUBSTR(Address2_temp,1,regexp_instr(Address2,commen_str2)-1) = Address1_temp then
                        return 1;
                      else
                        return 0;
                     end if;
                  end if;
              end if;
            else 
              return 0;
        end if;
    end;