MudGuard: Oracle DB: mind. 7 aufeinanderfolgende Zeichen aus x sollen in y vorkommen ...

Beitrag lesen

Hi,

ich habe eine Spalte dbspalte, die einen String von bis zu 40 Zeichen (Nur ASCII-Ziffern und ASCII-Buchstaben) enthält.

Desweiteren habe ich einen identisch aufgebauten (also bis zu 40, nur Ziffern/Buchstaben) Eingabestring.

Gefunden werden sollen die Zeilen in der Tabelle, in deren betroffener Spalte 7 aufeinanderfolgende Zeichen mit 7 aufeinanderfolgenden Zeichen aus dem Eingabestring übereinstimmen (jeweils an beliebiger Stelle).

Also z.B.:

db: abcdefghij eingabe: qqqcdefghixxx ⇒ Treffer (cdefghi paßt)
db: abcdefghij eingabe: qqqcdefyyyghixxx ⇒ kein Treffer (cdef und ghi passen zwar, aber die 7 Zeichen sind nicht aufeinanderfolgend)

Ja, ich weiß, das klingt seltsam - ich bin auch gegen die Implementierung dieses "Matching", aber ich will zumindest mal schauen, ob es eine brauchbare technische Lösung gibt.

Spontan fällt mir da für die Implementierung erst mal nur ein: prüfen, ob die Stellen 1 bis 7 des Eingabewerts in der dbspalte im Syncache vorkommt oder ob die Stellen 2 bis 8 des Eingabewerts in der dbspalte im Syncache vorkommt oder ob die Stellen 3 bis 9 des Eingabewerts in der dbspalte im Syncache vorkommt oder ob die Stellen 4 bis 10 des Eingabewerts in der dbspalte im Syncache vorkommt oder ob ... oder ob die Stellen n-6 bis n des Eingabewerts in der dbspalte im Syncache vorkommt

Daß da je nach Eingabewert-Länge unterschiedlich viele "oder" vorkommen, wäre kein Problem, die Query wird vom Programm erzeugt.

Aber das "kommt in x vor" zerlegt die Nutzung des Index. (wobei die Index-Nutzung bei OR auch oft verweigert wird).

Hat jemand eine Idee, wie man das besser realisieren kann?

Grad kommt mir noch eine - aber ist das schon das Optimum?

Regex Find mit (1bis7|2bis8|...|n-6bisn).
Dürfte auch nicht wirklich performant sein (braucht vermutlich auch einen Full Table Scan).

Hat noch jemand ne Idee? (darf auch in Mysql- oder Postgres-Syntax sein, ggf. such ich dann halt die Oracle-Entsprechungen)

cu,
Andreas a/k/a MudGuard