テスト ケースのスキーマとデータは次のとおりです。
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',' _ ');
今のところ mask 列を無視し、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 には一致しません。
しかし、インデックスやオプティマイザーなどを活用するためにこれを行うにはどうすればよいでしょうか...