Сопоставление шаблонов SQL

У меня вопрос, связанный с SQL.

Я хочу сопоставить два поля на предмет сходства и вернуть процент сходства.

Например, если у меня есть поле с именем doc, которое содержит следующее

This is my first assignment in SQL 

а в другом поле у ​​меня что-то вроде

My first assignment in SQL 

Я хочу знать, как я могу проверить сходство между ними и вернуть на сколько процентов.

Я провел небольшое исследование и хотел получить второе мнение, плюс я никогда не просил исходный код. Я просмотрел Soundex(), Difference(), сопоставление нечетких строк с использованием алгоритма расстояния Левенштейна.


person user1781162    schedule 28.10.2012    source источник
comment
Совет: изучите hamming distance и аналогичные алгоритмы подобия строк.   -  person Marc B    schedule 28.10.2012
comment
Я провел небольшое исследование и хотел получить второе мнение, плюс я никогда не просил исходный код. Я просмотрел Soundex(), Difference(), сопоставление нечетких строк с использованием алгоритма расстояния Левенштейна. Все равно спасибо за подсказку   -  person user1781162    schedule 28.10.2012


Ответы (1)


Вы не сказали, какую версию Oracle вы используете. Этот пример основан на версии 11g. Для определить, сколько символов нужно изменить, чтобы превратить одну строку в другую. Функция greatest возвращает наибольшее значение в списке переданных параметров. Вот пример:

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

результат:

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

Дополнение

Как правильно заметил @jonearles, гораздо проще использовать функцию edit_distance_similarity пакета utl_match.

 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
   ;

Результат:

         %
----------
        71
person Nick Krasnov    schedule 28.10.2012
comment
Спасибо! Я использую Oracle 11G. Я не ожидал никакого кода, так что спасибо! - person user1781162; 28.10.2012
comment
+1 Вероятно, вы можете упростить это с помощью utl_match.edit_distance_similarity(col1, col2). - person Jon Heller; 28.10.2012