SQL Server - 搜索名字和姓氏字段的全名

时间:2017-09-01 16:17:12

标签: sql-server tsql full-text-search

我假设我的用户输入可以是3种格式之一:“John”,“John Doe”或“Doe”。

我们最新版本的SQL Server数据库表Persons具有FirstName和LastName列。因为我不知道用户是否输入了全名,只输入了姓氏,或只输入了第一个名称,所以搜索和返回可能匹配的记录的最佳方式是什么?我正在考虑一个FULLTEXT搜索,但不确定这两个列的结果如何,特别是因为每个列只能包含部分输入,就像搜索“John Doe”时一样。

4 个答案:

答案 0 :(得分:0)

我会将输入分开并在应用层上使它们显式化。如果这不是一个选项,那么一种方式(其中FirstNames与LastNames相同的误报)将类似于下面的代码段。这假设只有一个空格(如果有的话)并且基于许多假设,这些假设将根据用户输入的内容而中断,因此我建议在应用层处理此问题。

declare @input varchar(256) = 'John Doe'

--if there is no space, then only a FirstName or LastName was supplied
if (select charindex(' ',@input)) = 0
begin
    select
        *
    from
        YourTable
    where
        FirstName = @input
        or
        LastName = @input
end

--if a space was found in input, we assume it was a FullName
else

begin
    select
        *
    from
        YourTable
    where
        FirstName = left(@input,charindex(' ',@input))
        and
        LastName = ltrim(right(@input,len(@input) - charindex(' ',@input)))
end

更模糊的方式是使用LIKE子句。

select
   *
from
   YourTable
where
   FirstName + ' ' + LastName like + '%' + @input + '%'

答案 1 :(得分:0)

Use the variable with datatype table or Use temporary table,here i use temporary table,check this its working

declare @input_name varchar(100)

create table #name(name1 nvarchar(50),name2 nvarchar(50))

set @input_name = 'John'----('John', 'John Doe', 'Doe')

INSERT INTO #name SELECT  substring(@input_name, 1,charindex(' ',@input_name))  ,substring(@input_name, charindex(' ',@input_name),len(@input_name)-charindex(' ',@input_name)+1)
select * from #name

select * from Persons  where FirstName  =(select name1 from #name ) or LastName =(select name2 from #name ) or FirstName  =(select name2 from #name ) or LastName =(select name1 from #name )  

drop table #name

答案 2 :(得分:0)

对于这种情况,我更喜欢在表中添加CleanName列。在您的实例中,这将是第一个名称和姓氏列合并为一个删除了所有非字母数字字符,因此John Doe将成为CleanName列中的johndoe。这是作为添加/更新数据的查询的一部分完成的。

然后你可以做一个简单的LIKE查询来找到你的匹配。

我更喜欢这种方法,因为一些姓氏具有非字母数字字符,例如O' Reilly,这样就不需要用户使用拼写和格式完全准确。

答案 3 :(得分:-2)

从表中选择*,其中(FirstName + LastName)类似于'%input%'