📜  查找相似类型的名称 | SQL中的模糊搜索

📅  最后修改于: 2022-05-13 01:55:32.489000             🧑  作者: Mango

查找相似类型的名称 | SQL中的模糊搜索

模糊搜索:
一种查找与模式近似匹配(而不是完全匹配)的字符串的技术。用户/审阅者经常不准确地捕获名称。打字错误是审阅者在捕获名称时经常犯的错误,导致数据不一致。但有时,我们无论如何都需要搜索或匹配这些不准确的数据。例如,用户应该匹配现有的客户记录,而不是创建不需要的重复项。

问题陈述 :
查找下表中描述的所有类型的错误类型,例如拼写错误、名称不完整、格式问题、缺少后缀。

     FirstName          LastName            FirstName         LastName                  Error Type                  
BenjaminSheriffBenjaminSherrifSpelling Mistake
CocoaFairchilCocoaFairchildSpelling Mistake
DanuzioPinheiroDanuzioPinherioSpelling Mistake
JeffVoightJeffVoigtSpelling Mistake
MariePrendergastMariePrendergrastSpelling Mistake
MichaelHeinrichMichaelHeinricySpelling Mistake
NghiaLeNghiaLeeSpelling Mistake
LeonardoMadrigalLeonardoMadrigal Del ValleIncomplete Name
YolandaBalcazarYolandaBalcazar-RodriguezIncomplete Name
JGarcia MartinezJGarcia-MartinezFormatting Issue
LaurenLord – TuleyLaurenLord-TuleyFormatting Issue
VirginiaPulley AlbertsVirginiaPulley-AlbertsFormatting Issue
ConnieMarksConnieMarks IvSuffix Missing
DanielLaddDanielLadd JrSuffix Missing
RodrigoDelgadoRodrigoDelgado JrSuffix Missing
ThomasGriffinThomasGriffin IiiSuffix Missing
WayneNanceWayneNance IiSuffix Missing

解决方法:
SOUNDEX()函数可以发现名称的不一致。 SOUNDEX() 可以评估两个名字的相似度。 SOUNDEX() 仅在我们有 1 或 2 个令牌时才有效。 Names 通常包含 1-2 个标记,因此它可以与 Name 一起使用。但是如果我们想为公司找到相似的名称,那么它就没有那么有用了,因为它包含多个令牌。

数据 :
Benjamin Sheriff 和 Benjamin Sherrif,其中 FirstName 相同,但 LastName 中的任何一个都有拼写错误。同样,此数据中存在许多错误,例如格式问题、名称不完整。

               FirstName                           LastName              
BenjaminSheriff
BenjaminSherrif
VirginiaPulley Alberts
VirginiaPulley-Alberts
GeofferyBown
GeoffreyBown
AnthoniCastoldi
AnthonyCastoldi
RodrigoDelgado
RodrigoDelgado Jr
LeonardoMadrigal
LeonardoMadrigal Del Valle
MitchelMyers
MitchellMyers

代码 :
案例 1:FirstName 完全相同,但 LastName 是类似的类型。
案例 2:LastName 完全相同,但 FirstName 是类似的类型。



下面我们一一讨论。

情况1 :
FirstName 完全相同,但 LastName 是类似的类型:

select distinct ss.firstname,ss.lastname,sd.firstname,sd.lastname
from load as ss, load as sd
where ss.firstName=sd.firstName and SOUNDEX(ss.lastName)=SOUNDEX(sd.lastname)
      and
      left(ss.lastname,2)=left(sd.lastname,2)
      and
      ss.lastName<>sd.lastName

输出 :  

               FirstName                           LastName                             FirstName                           LastName              
BenjaminSheriffBenjaminSherrif
BenjaminSherrifBenjaminSheriff
LeonardoMadrigalLeonardoMadrigal Del Valle
LeonardoMadrigal Del ValleLeonardoMadrigal
RodrigoDelgadoRodrigoDelgado Jr
RodrigoDelgado JrRodrigoDelgado
VirginiaPulley AlbertsVirginiaPulley-Alberts
VirginiaPulley-AlbertsVirginiaPulley Alberts

案例2:
LastName 完全相同,但 FirstName 类型相似:

select distinct ss.lastname,ss.firstname,sd.lastname,sd.firstname
from load as ss, load as sd
where ss.lastname=sd.lastname and SOUNDEX(ss.firstname)=SOUNDEX(sd.firstname)
      and
      left(ss.firstname,2)=left(sd.firstname,2)
      and
      ss.firstname<>sd.firstname

输出 :  

S.No.               FirstName                           LastName                             FirstName                           LastName              
1.AnthoniCastoldiAnthonyCastoldi
2.AnthonyCastoldiAnthoniCastoldi
3.GeofferyBownGeoffreyBown
4.GeoffreyBownGeofferyBown
5.MitchelMyersMitchellMyers
6.MitchellMyersMitchelMyers

参考 :
Github 链接 – https://github.com/SuryaSD/Finding-Similar-Types-of-Names-Fuzzy-Search