0

我有一个表,其中有一个名为 的列allocated_toassigned如果该列中有值,则表示该行的状态为else unassigned

从我的搜索框中,我正在发送1assigned0分配。此外,我对名为 的列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 条件下进行更改。Query 几乎有 4-5 if else 取决于它的标题条件,请不要建议我去动态过程。除此之外,欢迎。

4

2 回答 2

0

您可以添加几个可选参数,允许您指定结果是否应包括待处理/已关闭或已分配/未分配结果。通过这种方式,您可以保持单一、灵活的方式来检索结果。

查看此 SO Answer以了解在 SQL 中使用可选参数的概述。

于 2013-08-26T15:35:42.257 回答
0

所以,如果我理解正确,您可以独立过滤两个标准。选项 1 是“Pending”、“Closed”或“dont-filter”,选项 3 是“Assigned”、“Unassigned”和“dont-filter”。“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 足够聪明,可以使用参数嗅探来优化实际的查询运行,所以基本上,如果您0, 0作为参数发送,查询将执行为

select * from Items

如果您发送1, 2查询将执行为

select * from Items
where pending is not null
  and allocated_to is null
于 2013-08-26T15:43:34.230 回答