Вы можете выбрать одну из функций из пакета utl_match
:
with data (name1, name2) as (
select'john','jon' from dual union all
select'sara','sarah' from dual union all
select'filip','filis' from dual union all
select'phillip','philis' from dual
)
select name1, name2,
utl_match.edit_distance(name1, name2) as ed,
utl_match.edit_distance_similarity(name1, name2) as ed_similarity,
utl_match.jaro_winkler(name1, name2) as jw,
utl_match.jaro_winkler_similarity(name1, name2) as jw_similarity
from data;
возвращает:
NAME1 | NAME2 | ED | ED_SIMILARITY | JW | JW_SIMILARITY
--------+--------+----+---------------+------+--------------
john | jon | 1 | 75 | 0.93 | 93
sara | sarah | 1 | 80 | 0.96 | 96
filip | filis | 1 | 80 | 0.92 | 92
phillip | philis | 2 | 72 | 0.91 | 90
В зависимости от ваших потребностей и того, как вынапример результаты, вы можете сделать что-то вроде:
case when utl_match.edit_distance(name1, name2) < 2 then 1 else e end
Или использовать процент в качестве порога:
case when utl_match.edit_distance_similarity(name1, name2) > 75 then 1 else e end