我正在加载一个表来查找员工表。但是,有时源文件和 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 ;