我倾向于使用位值作为存储过程的参数来包含/排除记录。要在数据类型bit
的列上过滤查询现在很简单,因为我知道此SO帖子中的技术:
Cumulative include records in stored procedure output based on a number of bit parameters
但是,在某些情况下,我需要使用位参数来过滤具有多个条件的复合值。
以下是示例:
传递给存储过程的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))
答案 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