Fancy UDF basierend auf der Levenshtein-Distanz:
CREATE FUNCTION edit_distance(@s1 nvarchar(3999), @s2 nvarchar(3999))
RETURNS int
AS
BEGIN
DECLARE @s1_len int, @s2_len int, @i int, @j int, @s1_char nchar, @c int, @c_temp int,
@cv0 varbinary(8000), @cv1 varbinary(8000)
SELECT @s1_len = LEN(@s1), @s2_len = LEN(@s2), @cv1 = 0x0000, @j = 1, @i = 1, @c = 0
WHILE @j <= @s2_len
SELECT @cv1 = @cv1 + CAST(@j AS binary(2)), @j = @j + 1
WHILE @i <= @s1_len
BEGIN
SELECT @s1_char = SUBSTRING(@s1, @i, 1), @c = @i, @cv0 = CAST(@i AS binary(2)), @j = 1
WHILE @j <= @s2_len
BEGIN
SET @c = @c + 1
SET @c_temp = CAST(SUBSTRING(@cv1, @[email protected], 2) AS int) +
CASE WHEN @s1_char = SUBSTRING(@s2, @j, 1) THEN 0 ELSE 1 END
IF @c > @c_temp SET @c = @c_temp
SET @c_temp = CAST(SUBSTRING(@cv1, @[email protected]+1, 2) AS int)+1
IF @c > @c_temp SET @c = @c_temp
SELECT @cv0 = @cv0 + CAST(@c AS binary(2)), @j = @j + 1
END
SELECT @cv1 = @cv0, @i = @i + 1
END
RETURN @c
END
(. Cribbed von SQLTeam.com Foren)
Leider funktioniert dies nur, wenn zwei Saiten versehen, und in O (nm) Zeit, wo n und m sind die Länge der zwei Saiten. Sie könnten dies jedoch verbessern, indem Sie die Funktion so ändern, dass sie als "NO MATCH" ausschaltet, wenn @c größer ist als beispielsweise 3.
Aber Sie brauchen immer noch einen Cursor, um durch jeden Benutzernamen zu gehen in der Tabelle und vergleichen Sie es mit jedem anderen Benutzer. Nicht sehr effizient, das ist sicher.
Die resultierende Abfrage enthält nicht alle Benutzernamen, sondern nur die Benutzernamen, die vor den Nummern am Ende übereinstimmen. IE emily.hunt und dan.snyder würden nicht im Abfrageergebnis sein –
erwartest du, dass es mit Daten wie tim.smuth, tum.smith, tim.smiht funktioniert? –
Nun das Muster ist immer das gleiche hat es ein Vorname.Nachname Format und dann gibt es eine Möglichkeit, dass einige Namen eine Nummer am Ende haben –