如何使用可选搜索参数进行查询?

时间:2011-02-16 00:22:59

标签: c# sql-server-2008 dataset

我的表中有这些列;

Categ - int
WorkPlace - int
WorkPlace1 - int
AsignedAs - int

我正在使用C#

  1. 我想选择OR if的所有行 只有一个搜索参数是 不等于0 我添加了一个默认值来了解用户是否从组合框中进行选择 或不。

  2. 我想用AND选择它 顺序:如果超过搜索 参数不等于0(用户 选择价值)这样的事情

    WHERE Categ = @categ AND WorkPlace =
    @WorkPlace (user select two values
    

    其他是空白或等于 0

  3. WHERE WorkPlace = @WorkPlace AND
    WorkPlace1 = @WorkPlace1
    
  4. WHERE Categ = @Categ AND WorkPlace = @WorkPlace1 
    
  5. (用户选择这些值并且不为空,因此我们将and添加到查询中)

    依旧......

    所以我想检查值是否为空,以构建正确的查询。

2 个答案:

答案 0 :(得分:1)

请参阅Goran指出的链接以处理可选值 - 在您的情况下,如果用户未选择该选项,则需要将NULL传递给存储过程。如果您希望继续使用零(或其他值)来表示参数的不适用性,则可以修改查询,例如

WHERE 
   (COALESCE(@Categ, 0) = 0 OR Categ = @Categ) AND 
   (COALESCE(@WorkPlace, 0) = 0 OR WorkPlace = @WorkPlace) AND 
   (COALESCE(@WorkPlace1, 0) = 0 OR WorkPlace1 = @WorkPlace1) AND 
   (COALESCE(@AsignedAs, 0) = 0 OR AsignedAs= @AsignedAs) 

希望你能得到一般的想法!

答案 1 :(得分:0)

您也可以使用CASE方法。我发现这非常有用且简单,SQL查询优化器似乎为这种类型的lcause选择了更好的执行计划:

WHERE CASE WHEN @Categ = 0 THEN 0 ELSE Categ END = CASE WHEN @Categ = 0 THEN 0 ELSE @Categ END
AND CASE WHEN @WorkPlace = 0 THEN 0 ELSE WorkPlace END = CASE WHEN @WorkPlace = 0 THEN 0 ELSE @WorkPlace END
AND CASE WHEN @WorkPlace1 = 0 THEN 0 ELSE WorkPlace1 END = CASE WHEN @WorkPlace1 = 0 THEN 0 ELSE @WorkPlace1 END
AND CASE WHEN @AsignedAs = 0 THEN 0 ELSE AsignedAs END = CASE WHEN @AsignedAs = 0 THEN 0 ELSE @AsignedAs END