2012-08-22 84 views
2

我试图找到一种方法来搜索文本字段以识别可能类似的行,以便我可以确定它们是否应该合并重复。例如,如果数据我看起来像这样:Oracle查找类似但不完全匹配的重复记录

MyText_Column

    鲍勃
  1. 鲍比
  2. 罗伯特
  3. 詹尼
  4. 珍妮
  5. 约翰
  6. 乔纳森

一个GROUP BY将无法工作,因为没有值是完全一样的,但如果我能有一个查询,将返回的可能性的列表,一排类似会很好。也许有一个更好的布局,但我所想象的是这样一个结果:

查询结果

搜索比较Likely_Match

  1. 鲍勃·鲍比96%
  2. 鲍勃·罗伯特12%
  3. Bob Jane 0%
  4. Bob Janey 0%
  5. ... ..
  6. 简詹尼87%
  7. 简珍妮69%
  8. 简乔12%

然后用类似的结果,我可以由似然和目视扫描排序,以确定该结果是重复或不。

回答

4

UTL_MATCH package有几个方法可以做到这一点 - 我的猜测是您想要使用Jaro-Winkler相似度算法。像

SELECT a.mytext_column search, 
     b.mytext_column compare, 
     utl_match.jaro_winkler_similarity(a.mytext_column, b.mytext_column) similarity 
    FROM table_name a, 
     table_name b 
WHERE a.<<primary key>> != b.<<primary key>> 
ORDER BY utl_match.jaro_winkler_similarity(a.mytext_column, b.mytext_column) desc 

这将产生一个结果集N *(N-1)行的视行的原始数据集的数目可以是笨重。您可能希望通过仅返回特定搜索词的最佳匹配或仅返回具有大于某个阈值的相似度得分的行来限制事情。

2

您也可以使用SOUNDEX函数。