SQL Server全文搜索以匹配联系人姓名以防止重复

问题描述 投票:0回答:2

使用SQL Server Azure或2017与全文搜索,我需要返回名称上可能的匹配。

这是一个简单的场景:管理员正在输入新员工的联系信息,名字,姓氏,地址等。我希望能够在Employee表中搜索可能的名称匹配,看看是否有这个员工已经输入数据库。

这可能是作为autosuggest类型的功能发生的,或者只是显示一些类似的结果,如此处在Stackoverflow中,而管理员正在输入数据。

我需要防止重复!

如果管理员输入“Bob”,“Johnson”,我希望能够匹配:

  • 鲍勃约翰逊
  • 罗布约翰逊
  • 罗伯特约翰逊

这将使管理员可以选择是否已将此人输入数据库并选择其中一个选项。

是否可以对“Bob”这样的单词进行此类匹配,并在结果中包含“Robert”?如果是这样,有什么必要来实现这一目标?

sql-server full-text-search
2个回答
0
投票

SELECT * FROM tbl_Names WHERE Name LIKE'%user defined text%';

使用%%之间的文本将在数据中的任何位置搜索这些文本。


0
投票

试试这个。

您需要将@per参数值更改为您的要求。它表示第一个名称长度中的多少个字母应与要返回的结果匹配。我只是将它设置为50%用于测试目的。

循环内的动态SQL片段将所有第一个名字的CHARINDEX结果添加到所有现有的名字中。

注意事项:

重复的信件当然会产生误导,比如鲍勃会在Rob中计算3场比赛,因为鲍勃有2个B。

我没有考虑2个名字,比如Bob Robert Johnson等,所以这会失败。然而,你可以改进,但你明白了。

最终的SQL查询获取的LetterMatch大于或等于@per中的设置值。


DECLARE @name       varchar(MAX)    =   'Bobby Johnson' --sample name
DECLARE @first      varchar(50)     =   SUBSTRING(@name, 0, CHARINDEX(' ', @name))  --get the first part of the name before space
DECLARE @last       varchar(50)     =   SUBSTRING(@name, CHARINDEX(' ', @name) + 1, LEN(@name) - LEN(@first) - 1) --get the last part of the name after space
DECLARE @walker     int             =   1   --for looping
DECLARE @per        float           =   LEN(@first) * 0.50  --declare percentage of how many letters out of the length of the first name should match. I just used 50% for testing
DECLARE @char       char    --for looping
DECLARE @sql        varchar(MAX)    --for dynamic SQL use
DECLARE @matcher    varchar(MAX)    =   ''  --for dynamic SQL use

WHILE @walker <> LEN(@first) + 1 BEGIN --loop through all the letters of the first name saved in @first variable
    SET @char = SUBSTRING(@first, @walker, 1) --save the current letter in the iteration
    SET @matcher = @matcher + IIF(@matcher = '', '', ' + ') + 'IIF(CHARINDEX(''' + @char + ''', FirstName) > 0, 1, 0)' --build the additional column to be added to the dynamic SQL
    SET @walker = @walker + 1 --move the loop
END


SET @sql = 'SELECT * FROM (SELECT FirstName, LastName, ' + @matcher + ' AS LetterMatch
                           FROM TestName
                           WHERE LastName LIKE '  + '''%' + @last + '%''' + ') AS src
            WHERE CAST(LetterMatch AS int) >= ROUND(' + CAST(@per AS varchar(50)) + ', 0)'
SELECT @sql
EXEC(@sql)

© www.soinside.com 2019 - 2024. All rights reserved.