如何使用位参数来过滤存储过程中多个条件的记录?

时间:2016-09-06 21:03:34

标签: sql-server stored-procedures parameter-passing bit logical-operators

我倾向于使用位值作为存储过程的参数来包含/排除记录。要在数据类型bit的列上过滤查询现在很简单,因为我知道此SO帖子中的技术: Cumulative include records in stored procedure output based on a number of bit parameters

但是,在某些情况下,我需要使用位参数来过滤具有多个条件的复合值

以下是示例:

enter image description here

传递给存储过程的bit参数。

myproc 0 

上述调用只会返回一些除蓝色突出显示之外的记录。

一周一次,我需要致电

myproc 1

包含/累积这些记录WHERE ((Delta = 0) AND (PriceCurrent = PriceMin))。在上面的示例中,数据集必须包含两个蓝色突出显示的记录。

由于某种原因,代码

AND ((Delta = 0 AND PriceCurrent = PriceMinMin) 
     OR (@incl_min_price = 1 AND
         NOT (Delta = 0 AND PriceCurrent = PriceMin)))

对我不起作用。我做错了什么?

更新
无论它是什么,请忽略我的逻辑。我只想过滤传递一个比特值参数的记录。换句话说,myproc 0必须返回

SELECT * FROM MyTable
WHERE --several conditions separated by AND/OR

myproc 1必须产生上述

AND ((Delta = 0) AND (PriceCurrent = PriceMin))

1 个答案:

答案 0 :(得分:0)

许多可能变体中的三个选项:

create table #tmp (ID int identity(1,1), PriceMin int, PriceCurrent int, Delta as PriceCurrent - PriceMin)

insert #tmp 
values (10, 12), (10, 10), (10, 15), (9, 12), (3, 3)

declare @bit bit = 0

select  *
from    #tmp
where   (@bit = 1 or 
            (Delta <> 0 or PriceCurrent <> PriceMin)
        )

select  *
from    #tmp
where   (@bit = 1 or 
            (not(Delta = 0 and PriceCurrent = PriceMin))
        )

select  *
from    #tmp
where   @bit = 1 or @bit = case when Delta = 0 and PriceCurrent = PriceMin then 1 else 0 end