测试用例模式和数据如下:
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。
但是如何做到这一点来利用索引、优化器等......