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
- Gespräch mit Bruno Cirone ⇒ http://www.cirone.de/
Web
- Fast Similarity Searches ⇒ https://www.informatik.hu-berlin.de/de/forschung/gebiete/wbi/research/publications/2010/doag2010_final.pdf
12c Doku