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?
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!
Seit Oracle 11g R1 offiziell unterstützt.
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
Ä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
Person
Web
12c Doku