2012-10-28 19 views
5

Ich habe eine Frage im Zusammenhang mit SQL.SQL-Mustererkennung

Ich möchte zwei Felder für Ähnlichkeiten übereinstimmen und gibt einen Prozentsatz zurück, wie ähnlich es ist.

Zum Beispiel, wenn ich ein Feld namens doc haben, die folgende enthält

This is my first assignment in SQL 

und in einem anderen Feld Ich habe so etwas wie

My first assignment in SQL 

Ich möchte wissen, wie ich die Ähnlichkeiten überprüfen zwischen den beiden und zurück um wieviel Prozent.

Ich habe etwas recherchiert und wollte eine zweite Meinung und ich habe nie nach dem Quellcode gefragt. Ich schaute auf Soundex(), Differenz(), Fuzzy-String-Matching mit Levenshtein Abstand Algorithmus.

+3

Tipp: Schauen Sie in 'Hamming distance' und ähnliche Zeichenfolge Ähnlichkeitsalgorithmen –

+1

ich tat etwas Forschung und wollte eine zweite Meinung und ich nie für Quellcode gefragt. Ive schaute auf Soundex(), Differenz(), Fuzzy-String-Matching mit Levenshtein Abstand Algorithmus. Danke für den Tipp trotzdem – user1781162

Antwort

5

Sie haben nicht angegeben, welche Version von Oracle Sie verwenden. Dieses Beispiel basiert auf der 11g-Version. Sie können die edit_distance Funktion des utl_match Pakets verwenden, um zu bestimmen, wie viele Zeichen Sie ändern müssen, um eine Zeichenfolge in eine andere umzuwandeln. greatest Funktion gibt den größten Wert in der Liste der übergebenen Parameter zurück. Hier ein Beispiel:

-- sample of data 
with t1(col1, col2) as(
    select 'This is my first assignment in SQL', 'My first assignment in SQL ' from dual 
) 
-- the query 
select trunc(((greatest(length(col1), length(col2)) - 
       (utl_match.edit_distance(col2, col1))) * 100)/
      greatest(length(col1), length(col2)), 2) as "%" 
    from t1 

Ergebnis:

  % 
---------- 
    70.58 

Nachtrag

Wie @jonearles richtig darauf hingewiesen, es viel einfacher ist edit_distance_similarity Funktion von utl_match Paket zu verwenden.

with t1(col1, col2) as(
    select 'This is my first assignment in SQL', 'My first assignment in SQL ' from dual 
) 
    select utl_match.edit_distance_similarity(col1, col2) as "%" 
    from t1 
    ; 

Ergebnis:

  % 
---------- 
     71 
+0

Danke! Ich benutze Oracle 11G. Ich habe keinen Code erwartet, also Danke! – user1781162

+2

+1 Sie können dies wahrscheinlich mit 'utl_match.edit_distance_similarity (col1, col2)' vereinfachen. –