如何使用SQL从数据库中搜索多个条件?

时间:2009-10-20 13:11:21

标签: c# sql sql-server

我是一名新手程序员。我的页面如下所示。我有一个汽车数据库,我必须使用此页面从数据库中搜索。用户可以输入和选择值有许多标准。但是用户不必填写或选择所有标准。例如,用户可以搜索仅依赖于“Mark”的汽车或者可以搜索依赖于Year =“2007”Fuel =“diesel”Gear =“Automatic”...等等。我的问题是如何设计一个可以查询的检测哪些控件有价值。我使用C#和MSSQL Server。

alt text http://img8.imageshack.us/img8/5781/searchad.jpg

6 个答案:

答案 0 :(得分:2)

您应该足够灵活地构建查询(处理未填充的参数)以处理所有搜索条件。考虑相同的例子。如果用户仅输入标记字段,则保留为空白

示例代码,假设您有这些参数

@mark varchar(20)
@series varchar(20)
@model varchar(20)

select * from tbl 
where (@mark is null or markColumn=@mark) and
(@series is null or series Column=@series ) and
(@model is null or model Column=@model )

我建议您将所有参数单独传递给SP。这避免了查询的动态构造,并将避免SQL注入。

答案 1 :(得分:1)

如前所述,请注意sql注入。

我会避免带有多个参数的sp,因为这些参数可能是一个很大的数字,并且sp需要改变。此外,查询要非常慢。

从我所看到的,最好在代码中构建查询,只使用所需的限制器/过滤器并避免

@param is null OR filed = @param

答案 2 :(得分:1)

这是一篇关于如何处理这个主题的非常全面的文章:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

它涵盖了尝试使用多个可选搜索条件编写查询的所有问题和方法

这是目录:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

答案 3 :(得分:0)

您可以通过连接具有为其指定值的所有字段,在应用程序中动态编写查询。例如“...... WHERE Model ='abc'AND Color ='Blue'AND ......”。没有值的字段将不包含在WHERE子句中。如果您使用此方法,则需要非常小心检查SQL注入攻击的输入字段。

更好的方法是在数据库中创建一个存储过程,该存储过程具有所有输入字段的参数。您可以为用户未输入值的字段传入空值。但是,您必须确保SP可以正确处理具有空值的参数并相应地过滤结果集。

答案 4 :(得分:0)

你可以拥有

的内容
select * from cars where model like case when @model = '' then '%' else '%'+@model+'%' end

依此类推。丑陋,但它应该工作。

这是一个快速查询我作为一个例子敲了

declare @model varchar(20)
set     @model = 't'
select  * 
from    (
            select 'one' as model
            union
            select 'two'
            union
            select 'three' 
        ) as model
where   model like case when @model = '' then '%' else '%'+@model+'%' end

然后无限制地添加AND子句,空时使用%s,需要时使用搜索字符串。

答案 5 :(得分:0)

Linq不会创建select语句,直到实际使用它为止。因此,您可以执行类似于以下操作的内容:

public IQueryable<object> GetObjects(int a, string b)
{
     var q = from i in items
             where(i=>i.id == a)
             select i;
     if(!string.IsNullOrEmpty(b))
         q = q.where(o=>o.Name == b);
     return q;
}

这不是袖口,所以我的语法可能不是100%,但应该很接近。

我应该提到,这是表单调用以获取结果集的方法。