=====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