2010-07-21 73 views
3

我有一个客户,有2列名和姓(SQL Server 2008)。用户希望按姓名搜​​索 - 或者只需输入Jo Bloggs。假设一列装满SQL Server 2008中的LIKE函数需要建议

CustomerId  Name Surname 
1     Jo  Bloggs 

select * from customer where Name like '%Jo%'    will find the records 
select * from customer where Surname like '%Bloggs%'  will find the records 

但我怎样才能使它返回记录,如果用户类型都名和姓乔如布洛斯?

回答

3

这应该工作的用户是否进入:名字,姓氏或两者兼而有之。

SELECT * 
FROM customer cus 
WHERE ((cus.Name like @FirstName) OR (@FirstName IS NULL)) AND 
     ((cus.Surname like @Surname) OR (@Surname IS NULL)) 

我用两个变量由于进入输入值到一个SQL字符串是强烈反对,因为它暴露给SQL注入(不是被较慢其他)。

+0

谢谢大家的答复。不止一个答案会工作,但我不得不选择一个。 谢谢 – user9969 2010-07-21 13:30:11

3
select * from customer where Name like '%Jo%' and Surname like '%Bloggs%' 
+0

应该工作...即使用户没有输入姓名或姓氏,比如'%%'会匹配所有... – StuartLC 2010-07-21 12:20:02

+1

将会工作 - 但它总是会进行全表扫描,因为使用'LIKE%Jo%'将无法处理由索引....表现将是丑陋的.... – 2010-07-21 12:22:25

0
select * from customer where Name like '%Jo%'    
union 
select * from customer where Surname like '%Bloggs%' 
+0

这将给'或'我认为OP希望'和' – 2010-07-21 12:48:21

4

您还可以创建一个计算列,并在该搜索:

ALTER TABLE dbo.customer 
    ADD FullName as Name + ' ' + Surname PERSISTED 

现在你有一个额外的列FullNamecustomer表,这始终是最新的,你可以搜索:

SELECT (list of fields) FROM dbo.customer 
    WHERE Fullname = 'Jo Bloggs' 

,并因为它是一个持续,计算列,你甚至可以把一个指标就可以进行精确的搜索速度更快