我假設我將有用戶輸入可以使用3種格式之一:「John」,「John Doe」或「Doe」。SQL Server - 在名字和姓氏字段中搜索姓名
我們最新版本的SQL Server數據庫表Persons有FirstName和LastName列。因爲我不確定用戶是否輸入了全名,只輸入了姓氏,或者只輸入了第一個名稱,那麼搜索和返回可能匹配記錄的最佳方法是什麼?我正在考慮FULLTEXT搜索,但不知道這將如何跨越兩列,特別是因爲每個列只能包含部分輸入,就像搜索「John Doe」時一樣。
我假設我將有用戶輸入可以使用3種格式之一:「John」,「John Doe」或「Doe」。SQL Server - 在名字和姓氏字段中搜索姓名
我們最新版本的SQL Server數據庫表Persons有FirstName和LastName列。因爲我不確定用戶是否輸入了全名,只輸入了姓氏,或者只輸入了第一個名稱,那麼搜索和返回可能匹配記錄的最佳方法是什麼?我正在考慮FULLTEXT搜索,但不知道這將如何跨越兩列,特別是因爲每個列只能包含部分輸入,就像搜索「John Doe」時一樣。
我會分開輸入,並在應用程序層使它們顯式化。如果這不是一種選擇,則一種方式(其中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 + '%'
選擇*,其中(名字+姓氏)LIKE '%輸入%'
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
試試這個工作吧 –
對於這種情況,我寧願一個CleanName列添加到表中。在你的實例中,這將是第一個名字和姓氏列合併成一個,所有非字母數字字符都被刪除,因此John Doe將成爲CleanName列中的johndoe。這是作爲添加/更新數據的查詢的一部分完成的。
然後你可以做一個簡單的LIKE查詢來找到你的匹配。
我更喜歡這種方法,因爲一些姓氏具有非字母數字字符,比如O'Reilly,所以這樣就不需要用戶在拼寫和格式上完全準確。
如果我正確地理解了這一點,以你給出的John Doe爲例,可能性是(FirstName,LastName):'NULL,Doe'或'John,Doe'或'John,NULL'? – Simon
[Falsehoods Programmers Believe About Names](http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)。 – HABO