=====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 [[prog:sql_nls_comp_nls_sort_inguistic_search_sorting|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 * https://en.wikipedia.org/wiki/Hamming_distance 12c Doku * https://docs.oracle.com/database/121/ARPLS/u_match.htm#ARPLS352