2017-09-01 197 views
1

我假設我將有用戶輸入可以使用3種格式之一:「John」,「John Doe」或「Doe」。SQL Server - 在名字和姓氏字段中搜索姓名

我們最新版本的SQL Server數據庫表Persons有FirstName和LastName列。因爲我不確定用戶是否輸入了全名,只輸入了姓氏,或者只輸入了第一個名稱,那麼搜索和返回可能匹配記錄的最佳方法是什麼?我正在考慮FULLTEXT搜索,但不知道這將如何跨越兩列,特別是因爲每個列只能包含部分輸入,就像搜索「John Doe」時一樣。

+0

如果我正確地理解了這一點,以你給出的John Doe爲例,可能性是(FirstName,LastName):'NULL,Doe'或'John,Doe'或'John,NULL'? – Simon

+1

[Falsehoods Programmers Believe About Names](http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)。 – HABO

回答

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 + '%' 
-2
從表

選擇*,其中(名字+姓氏)LIKE '%輸入%'

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 
+0

試試這個工作吧 –

0

對於這種情況,我寧願一個CleanName列添加到表中。在你的實例中,這將是第一個名字和姓氏列合併成一個,所有非字母數字字符都被刪除,因此John Doe將成爲CleanName列中的johndoe。這是作爲添加/更新數據的查詢的一部分完成的。

然後你可以做一個簡單的LIKE查詢來找到你的匹配。

我更喜歡這種方法,因爲一些姓氏具有非字母數字字符,比如O'Reilly,所以這樣就不需要用戶在拼寫和格式上完全準確。