【发布时间】:2010-11-19 16:41:20
【问题描述】:
测试用例架构和数据如下:
create table tmp
(
vals varchar(8),
mask varchar(8)
);
insert into tmp values ('12345678',' ');
insert into tmp values ('12_45678',' _ ');
insert into tmp values ('12345678',' _ ');
insert into tmp values ('92345678',' ');
insert into tmp values ('92345678',' _ ');
暂时忽略掩码列并假设存在 specialmatch 函数:
select VALS from tmp where specialmatch(vals,'12345678');
应该产生:
VALS
12345678
12_45678
12345678
接下来,
select VALS from tmp where specialmatch(vals,'92345678');
应该产生:
VALS
92345678
92345678
接下来,
select VALS from tmp where specialmatch(vals,'_2345678');
应该产生:
VALS
12345678
12_45678
12345678
92345678
92345678
接下来,
select VALS from tmp where specialmatch(vals,'12945678');
应该产生:
VALS
12_45678
关于如何制作特殊匹配功能的任何想法?
我幼稚的做法是写一个特殊的字符串比较udf(伪代码):
bool function specialmatch(str1,str2) DETERMINISITC
{
return false if either are null;
for each char1,char2 of str1,str2
{
if (char1<>char2 && char1<>'_' && char2<>'_') return false;
}
return true;
}
在进行匹配之前,还需要将掩码覆盖在 val 上。
例如:val='1_345678', mask=' _ _' => 1_34567_ 将匹配 12345678 和 19345679 但不匹配 92345678。
但是如何做到这一点来利用索引、优化器等...
【问题讨论】:
标签: performance oracle indexing query-optimization user-defined-functions