2010-05-05 68 views
1

我有2个字段的表学生搜索:编写SQL与多个条件

Name: nvarchar(256) 
Age: int 

用户将使用一个WinForm应用程序输入名称和用于搜索时代。

  • 如果输入的名称为空,sql将不会查询名称字段。
  • 如果输入的Age是0,sql将不会查询Age字段。
  • 如果名称为空且输入名称为空 - >记录匹配。如果名称为空且输入的名称不为空 - >记录不匹配。 Age字段也类似。

我的问题是,如何写这样的SQL。

P/S:我使用SQL Server 2005.

请帮帮我。谢谢。

回答

3

一种方法是使参数为空的,并使用此模式:

Create Procedure MyTest 
(
    @param1 int = NULL, 
    @param2 varchar = NULL 
) 
AS 
BEGIN 

SELECT Blah... 
FROM Table 
WHERE 
    ((@param1 IS NULL) OR (somecolumn = @param1)) AND 
    ((@param2 IS NULL) OR (someothercolumn = @param2)) 


END 

[注:它可以有参数嗅探副作用,如果有很多参数...]

1
select * from thetable 
where (@name='' or [name][email protected]) and (@age=0 or [email protected]) 

但是,上面的查询强制进行表扫描。为了获得更好的性能和更复杂的场景(我想你简化了原始帖子中的问题),考虑使用动态sql。顺便说一句,LINQ到SQL可以帮助您构建动态SQL很容易,像下面这样:

IQueryable<Person> persons = db.Persons; 
if (!string.IsNullOrEmpty(name)) persons = persons.Where(p=>p.Name==name); 
if (age != 0) persons = persons.Where(p=>p.Age=age); 
+0

该查询不应强制启动表扫描。还要注意''和0与NULL不相同。 – TomTom 2010-05-05 04:15:28

+0

@TomTom:从理论上讲,第一个查询不一定会导致表扫描,但实际上它可以处理99.9%的情况,因为查询分析器会在查询中看到很多值列。通常这些价值栏不适合指数。 – Codism 2012-11-14 17:21:30