使用SQL Server Azure或2017与全文搜索,我需要返回名称上可能的匹配。
这是一个简单的场景:管理员正在输入新员工的联系信息,名字,姓氏,地址等。我希望能够在Employee表中搜索可能的名称匹配,看看是否有这个员工已经输入数据库。
这可能是作为autosuggest类型的功能发生的,或者只是显示一些类似的结果,如此处在Stackoverflow中,而管理员正在输入数据。
我需要防止重复!
如果管理员输入“Bob”,“Johnson”,我希望能够匹配:
这将使管理员可以选择是否已将此人输入数据库并选择其中一个选项。
是否可以对“Bob”这样的单词进行此类匹配,并在结果中包含“Robert”?如果是这样,有什么必要来实现这一目标?
SELECT * FROM tbl_Names WHERE Name LIKE'%user defined text%';
使用%%之间的文本将在数据中的任何位置搜索这些文本。
试试这个。
您需要将@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)