编写一个sql用于搜索多个条件

时间:2010-05-05 03:47:16

标签: sql sql-server sql-server-2005

我有一个包含2个字段的学生表:

Name: nvarchar(256)
Age: int

用户将使用WinForm应用程序输入名称和年龄进行搜索。

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

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

P / S:我使用SQL Server 2005。

请帮帮我。感谢。

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

但是,上面的查询强制进行表扫描。为了获得更好的性能和更复杂的场景(我猜你简化了原帖中的问题),请考虑使用动态sql。顺便说一句,Linq to 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);

答案 2 :(得分:0)

我会使用动态SQL,根据输入使用可变数量的术语构建WHERE子句。

我最近回答了类似案件的问题。请参阅以下示例的答案:

这些问题与PHP有关,但该技术可以适应任何编程语言。