2017-10-18 52 views
0

我期待编写一个T-SQL函数,该函数将返回需要从两个中的一个中删除的最少字符数字符串,以便字符串成为另一个的子字符串。T-SQL:要删除/替换的字符的最小数目,以便一个字符串是另一个字符串的子字符串

问题是,我想确定两个姓氏有多相似。有时候,人们有多个姓氏。在我们客户的数据库中,偶尔我们会发现,我们存储两个姓,而客户只存储一个姓,或者客户存储两个姓,而我们只存储一个姓。由于我不能确定它会是哪一个,我的想法是从一个字符串开始,看看我需要删除或替换多少个字符,以使一个字符串成为另一个字符串的子字符串。所以,如果我们系统中的姓氏是'Johnson-Smith',而他们系统中的姓氏是'Johnson',那么将删除零个字符,以便'Johnson'是'Johnson-Smith'的子字符串。或者,如果我们拼写了'Johnsen-Smith'这个名字,那么在'Johnsen-Smith'的子串之前,我们需要从'Johnson'中删除至少两个字符。但是,如果我们用'o'字符替换'e',则在Johnson是修改字符串的子字符串之前替换它是一个字符。所以,函数应该返回1.

或者如果我们有'约翰逊史密特',他们有'史密斯',我们只需要删除一个字符,以便'史密特'是'约翰逊史密特'的子字符串。

这种类型的距离是否有名字?我很熟悉Levenshtein和Hamming之间的距离,但在比较过去的名字时都没有证明特别有用。

有没有人有这样的功能?我在想我写的东西不会特别有效。有关如何最大限度提高效率的建议?

回答

1

“两个”姓氏与“一个”姓氏的奇怪很奇怪,可能几乎不可能解决。但是像Johnsen-Smith和Johnson-Smith这样的东西使用SOUNDEX很容易。 https://docs.microsoft.com/en-us/sql/t-sql/functions/soundex-transact-sql

select SOUNDEX('Johnsen-Smith') 
    , SOUNDEX('Johnson-Smith') 
    , SOUNDEX('Smith-Johnson') --provided this to demonstrate that the results are quite different. 
+0

谢谢。我实际上一直在使用它,如果我用''替换' - '并获取字符串的第一个字和最后一个字,我可以执行以下检查: (DIFFERENCE(dbo.FirstWord(REPLACE(A.LastName,' - ','')),dbo.FirstWord(REPLACE(B.LastName,' - ','')))= 4 \t或DIFFERENCE(dbo.FirstWord(REPLACE(A.LastName,' - ','' )),dbo.LastWord(REPLACE(B.LastName,' - ','')))= 4 \t或DIFFERENCE(dbo.LastWord(REPLACE(A.LastName,' - ','')),dbo。 (REPLACE(B.LastName,' - ','')))= 4 \t或DIFFERENCE .LastName,' - ','')))= 4) – InterstellarProbe

+0

该检查提供了我想要的数据。我只需要创建一个简单的FirstWord和LastWord函数。 CREATE FUNCTION dbo.FirstWord(@value为nvarchar(4000)) BEGIN RETURN CASE CHARINDEX( ' '@值,1)当0 THEN ELSE @value LEFT(@值,CHARINDEX('',@值) - 1)END END CREATE – InterstellarProbe

+0

FUNCTION dbo.LastWord(@value为nvarchar(4000))BEGIN RETURN CASE CHARINDEX(””,@值,1)当0 THEN ELSE @value REVERSE(LEFT(REVERSE(@value),CHARINDEX( '',REVERSE(@value)) - 1))END END GO – InterstellarProbe

相关问题