Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_string_vergleich

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

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
prog/oracle_string_vergleich.txt · Zuletzt geändert: 2016/03/25 16:50 von gpipperr