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