2017-10-18 54 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

相關問題