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;
道路通名(路、街、巷、弄、胡同、大街、道、大道)我们在判断的时候认为括号里面的通名是等价的,例如 曙光路——曙光街 判断的时候我们认为他们同一条路!
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;
(
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;
(
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;
------------------------------------
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
regexp_instr
(
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;
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;
[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了。
[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了。
你试试select IsEqual_Fun('大大南大道','大北大路') from dual
确实是这样,但是北大路不符合命名规则呀,没有大路这个道路通名呀。另外补充给楼主一句,你写的之所以不好用的原因是:
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;
/
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楼说的情况,还是改成下面这样保险,也再次感谢#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;
/
在你写的函数中'前进路'和'路前进'和'前路进'都是一样的。这就是replace成''的缺点
还有楼主的代码中体现了对一个问题的考虑:路|大街|街.....如果是在字符串的头部不进行转换处理
比如 '巷子路' 和 '弄子路' 不应该返回1.我10楼写的大体上跟你的没什么区别,就是多考虑了这两个地方
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;