甲骨文:模糊查找



我正在加载一个表来查找员工表。但是,有时源文件和 Employee 表中的名称不匹配。

**Employee table:**
Employee Name
Paul Jaymes
**Source File**
Paul James

我希望这个匹配。可能的解决方案是什么。

使用 UTL_MATCH 包或 SOUNDEX 函数:

SQL 小提琴

Oracle 11g R2 架构设置

CREATE TABLE Employees ( Name ) AS
SELECT 'Paul Jaymes' FROM DUAL;

查询 1

UTL_MATCH.EDIT_DISTANCE : 计算将字符串 1 转换为字符串 2 所需的更改数

SELECT *
FROM   Employees
WHERE  UTL_MATCH.EDIT_DISTANCE( Name, 'Paul James' ) < 2

查询 2

UTL_MATCH.EDIT_DISTANCE_SIMILARITY : 计算将字符串 1 转换为字符串 2 所需的更改数,返回介于 0(不匹配(和 100(完全匹配(之间的值

SELECT *
FROM   Employees
WHERE  UTL_MATCH.EDIT_DISTANCE_SIMILARITY( Name, 'Paul James' ) > 90

查询 3

UTL_MATCH.JARO_WINKLER : 计算字符串 1 和字符串 2 之间的一致性度量

SELECT *
FROM   Employees
WHERE  UTL_MATCH.JARO_WINKLER( Name, 'Paul James' ) > 0.9

查询 4

UTL_MATCH.JARO_WINKLER_SIMILARITY : 计算字符串 1 和字符串 2 之间的一致性度量,返回介于 0(不匹配(和 100(完全匹配(之间的值

SELECT *
FROM   Employees
WHERE  UTL_MATCH.JARO_WINKLER_SIMILARITY( Name, 'Paul James' ) > 95

查询 5

SOUNDEX : 返回包含 char 的语音表示形式的字符串。此功能可让您比较拼写不同但英语发音相似的单词。

SELECT *
FROM   Employees
WHERE  SOUNDEX( Name ) = SOUNDEX( 'Paul James' )

结果: 都给出输出:

|        NAME |
|-------------|
| Paul Jaymes |

使用UTL_MATCH。EDIT_DISTANCE_SIMILARITY Oracle 中的函数。

我建议创建一个临时表,如下所示,并检查数据是否符合预期。通常分数在90-93以上应该是相同的,在不同的系统中有一些错别字。如果 1 个字符只有差异,您将获得 92 分及以上的分数。

select s.employee_name,
utl_match.edit_distance_similarity(initcap(s.employee_name),e.employee_name) as score
from source_table s cross join employee_table e
where utl_match.edit_distance_similarity(initcap(s.employee_name),e.employee_name) >=90 ;

最新更新