2012-10-28 26 views
5

SQL ile ilgili bir sorum var.SQL desen eşleme

Benzerlik için iki alanı eşleştirmek ve benzer bir yüzdeye yüzde geri dönmek istiyorum.

Ben içeren doc olarak adlandırılan bir alan varsa Örneğin

aşağıdaki

This is my first assignment in SQL 

ve başka alanda İstediğim

My first assignment in SQL 

gibi bir şey ben benzerlikler nasıl kontrol edebileceklerini bilmek zorunda ikisi arasında ve ne kadar yüzde geri dönüş.

Biraz araştırma yaptım ve ikinci bir görüş istedim artı kaynak kodu istemedim. Levenshtein mesafe algoritmasını kullanarak Soundex(), Difference(), Fuzzy string eşleştirmesine baktım.

+3

İpucu: hamming distance' ve benzeri dize benzerlik algoritmaları –

+1

'içine bak biraz araştırma yaptım ve ikinci bir görüş istedik artı kaynak kodu için sormadım. Levenshtein mesafe algoritmasını kullanarak Soundex(), Difference(), Bulanık dize eşleştirmesine baktım. Ucu için teşekkürler – user1781162

cevap

5

Kullandığınız hangi Oracle sürümünü kullanmadınız. Bu örnek 11g sürümüne dayanmaktadır. utl_match paketinin edit_distance işlevini kullanarak, bir dizeyi diğerine dönüştürmek için kaç karakter değiştirmeniz gerektiğini belirleyebilirsiniz. greatest işlevi, parametrelerde geçirilenler listesindeki en büyük değeri döndürür. @jonearles doğru belirttiği gibi, utl_match paketin edit_distance_similarity işlevini kullanmak çok daha kolaydır

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

Ek

:

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

Sonuç: İşte bir örnek.

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 
    ; 

Sonuç:

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

Teşekkürler! Oracle 11G kullanıyorum. Herhangi bir kod beklemiyordum, teşekkürler! – user1781162

+2

+1 Bunu muhtemelen 'utl_match.edit_distance_similarity (col1, col2) 'ile basitleştirebilirsiniz. –