Inhaltsverzeichnis

In der Oracle Datenbank Strings vergleichen und Ähnlichkeiten in String qualifizieren

10g R2 / 11g / 12c

Wie gleich bzw. wie ähnlich sind zwei Strings? Diese Frage stellt sich oft wenn Kundennamen und Adressen aus verschiedenen Quellen zusammen gezogen werden sollen. Beispiel:

Ist der String „Gunther“ = „gunther“ gleich oder nur ähnlich? Und wie ähnlich ist dann das ganze?


Case in sensitive vergleichen und sortieren

Geht es nur darum die GROSS/klein Schreibung zu ignorieren, muss das entweder über eine upper/lower Funktion erfolgen oder die ganze Session wird auf einen Linguistischen Vergleich umgestellt.

siehe auch NLS_COMP und NLS_SORT für Linguistische Vergleiche und Case Ignore in der Oracle Datenbank

SELECT *  FROM DUAL WHERE 'Gunther' = 'gunther';
 
 
no ROWS selected
 
 
ALTER SESSION SET NLS_COMP=LINGUISTIC;
ALTER SESSION SET NLS_SORT=BINARY_CI;
 
SELECT *  FROM DUAL WHERE 'Gunther' = 'gunther';
 
DUM
---
X

!Achtung!

Im Ausführungsplan wird dann aber evtl. ein vorhandener Index auf die Spalte nicht mehr verwendet, da die Filterbedingung für den Linguistischen Vergleich als Funktion im Hintergrund vom Optimzier einbaut wird!


UTL_MATCH Package für den String Vergleich

Seit Oracle 11g R1 offiziell unterstützt.

Edit Distance - "Levenshtein Distance"

Wie stark unterscheiden sich zwei Strings ⇒ https://en.wikipedia.org/wiki/Levenshtein_distance

SELECT UTL_MATCH.Edit_Distance('abcde', 'cdef') AS sd FROM DUAL;
 
sd
--
3
 
-- Als Wert zwischen 0 und 100 (100=gleich)
 
SELECT UTL_MATCH.Edit_Distance_SIMILARITY('abcde', 'cdef') AS sd FROM DUAL;
 
sd
--
40

Die Distance zwischen zwei Strings ist die Anzahl an Einfügungen, Löschungen und Substitutionen um den ersten String in den zweiten zu überführen, die kleinste Anzahl der notwendigen Änderungen

JARO_WINKLER Funktion

Ähnlichkeit zweier Strings quantifizieren ⇒ siehe https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance

SET numwidth 30
 
 
 
SELECT UTL_MATCH.JARO_WINKLER('gunther', 'gunter')  AS sq FROM DUAL;
 
sq
---
 9.7142857142857142E-001
 
 
 
 
-- Als Wert zwischen 0 und 100 (100=gleich)
 
SELECT UTL_MATCH.JARO_WINKLER_SIMILARITY('gunther', 'gunter')  AS sq FROM DUAL;
 
 SQ
---
 97

Quellen

Person

Web

12c Doku