T-Sql条件检查

时间:2013-08-26 15:08:10

标签: sql-server sql-server-2008 tsql

我有一个名为allocated_to的列表。如果该列中有值,则表示该行的状态为assigned,否则为unassigned

在我的搜索框中,我发送1 assigned0未分配。此外,我对名为pending的列上的closedSignOff (type: int)进行了两次类似的检查。

现在我们总共有9个搜索条件

1. Pending
2.Closed
3. Unassigned
4. Assigned
5. Pending + Unassigned
6. Pending + Assigned
7. Closed + Unassigned
8. Closed + Assigned
9. For all records irrespective of any statuses. 

那么我如何为查询添加条件。实际上它的SP和SP的变化已经开始运行。所以我无法通过使其变得动态或无论如何在我的查询中做出巨大的改变。

我可以在这里给你一个示例,我的查询如何:

If Some_Condition
 begin
   Select x,y,zfrom T1 join T2 on t1.a=t2.b
   Where IsNull(SignOff,0)=@ParamForPendingAndClosed
 end

现在我想在这里添加我的上述9项检查,任何帮助??

请注意:

我无法进行大量改动,因为我需要在每一个if-else条件下制作。查询几乎有4-5,否则取决于其标题条件,请不要建议我去动态程序。除此之外,欢迎。

2 个答案:

答案 0 :(得分:0)

您可以添加一些可选参数,以指定结果是应包括待处理/已结算还是已分配/未指定结果。这样,您可以保持一种灵活的检索结果的方式。

请查看this SO Answer,了解在SQL中使用可选参数的概述。

答案 1 :(得分:0)

所以,如果我理解正确,你可以独立过滤两个标准。选项1是“待定”,“关闭”或“不过滤”,选项3是“已分配”,“未分配”和“不过滤”。 “dont-filter”表示该条件不用于过滤项目,即返回的项目可以包含该参数的任何值。

组合这两个过滤器可以得到3 X 3 = 9种情况。

我要做的是使用发送到过程的参数值来根据我的需要塑造查询:

create procedure getItems
   @Status int, -- 0 - don't filter, 1 - pending, 2 - closed
   @Assignment int -- 0 - don't filter, 1 - assigned, 2 - not assigned
as
begin
  select * from Items
  where ((@Status = 0) 
          and ((@Assignment = 0) -- no filter at all
              or (@Assignment = 1  and allocated_to is not null) 
              or (@Assignment = 2  and allocated_to is null)))
    or  ((@Status = 1 and pending is not null) 
          and ((@Assignment = 0) 
              or (@Assignment = 1  and allocated_to is not null) 
              or (@Assignment = 2  and allocated_to is null)))
   or  ((@Status = 2 and closed is not null) 
          and ((@Assignment = 0) 
              or (@Assignment = 1  and allocated_to is not null) 
              or (@Assignment = 2  and allocated_to is null)))
end

SQL Server足够聪明,可以使用parameter sniffing来优化实际的查询运行,所以基本上,如果您发送0, 0作为参数,查询将以

执行
select * from Items

如果您发送1, 2,则查询将以

执行
select * from Items
where pending is not null
  and allocated_to is null