Testfall Schema und die Daten folgen, wie haben:String-Matching in Oracle 10g, wo jeder Seite können Platzhalter
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',' _ ');
Ignorieren der Maske Spalte für jetzt und unter der Annahme der specialmatch Funktion vorhanden ist:
select VALS from tmp where specialmatch(vals,'12345678');
Sollte produzieren:
VALS
12345678
12_45678
12345678
Als nächstes
select VALS from tmp where specialmatch(vals,'92345678');
Sollte produzieren:
VALS
92345678
92345678
Als nächstes
select VALS from tmp where specialmatch(vals,'_2345678');
Sollte produzieren:
VALS
12345678
12_45678
12345678
92345678
92345678
Als nächstes
select VALS from tmp where specialmatch(vals,'12945678');
Sollte produzieren:
VALS
12_45678
Alle Ideen, wie die besondere Match-Funktion zu machen?
Mein naiver Ansatz ist eine spezielle Zeichenfolge vergleichen UDF (Pseudo-Code) zu schreiben:
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;
}
auch vor zu tun, das Spiel der Maske auf der val überlagert werden muss.
Ex: val = '1_345678', mask = '_ _' => 1_34567_ und würde 12345678 und 19345679 passen, aber nicht 92345678.
Aber wie kann dies zu Leverage Indizes, Optimierer usw. durchgeführt werden ..
Ja, ich habe mir auch eine Regex-Lösung angeschaut. Das Problem dabei ist der erhebliche Overhead, während auf beiden Seiten immer noch Probleme mit Platzhaltern auftreten. .2345 würde^(.) Werden (2 | \.) (3 | \.) (4 | \.) (5 | \.) $ nicht für Klarheit optimiert –