2009-09-20 25 views
1

我有以下查询:的SQL Server 2008 - 布尔变量的变化查询

DECLARE @IsStocked bit 
SELECT * FROM Products p WHERE p.LastSeen > GETDATE() - 30 

这将返回所有产品已经看到在过去30天。

我的问题是,我希望p.LastSeen > GETDATE() - 30条款只适用于@IsStocked = true

这是一个较大的查询的一部分,我希望在不使用IF/ELSE语句的情况下实现此目的(即,如果@IsStocked = falsep.LastSeen > GETDATE() - 30部分被完全忽略)。

谢谢!

+1

为什么你不想使用IF/ELSE?另一种选择可能会导致错误地缓存的查询计划...为简单起见, – 2009-09-20 10:21:07

+0

确实存在 - 存在大约10个变量 - 所有这些都可以是真/假或空 - 除非有一种方法可以表明这种情况不会发生导致每个IF/ELSE?谢谢! – db1234 2009-09-20 10:28:46

回答

4
DECLARE @IsStocked bit 

SELECT * FROM Products p 
WHERE @IsStocked = 0 OR (p.LastSeen > GETDATE() - 30); 
4
DECLARE @IsStocked bit; 

SELECT * 
FROM Products p 
WHERE (@IsStocked = 1 AND p.LastSeen > GETDATE() - 30) 
OR  @IsStocked = 0; 
+0

你的逻辑可以稍微简化... – 2009-09-20 10:23:08

+0

优秀 - 感谢您的帮助! – db1234 2009-09-20 10:26:45

+1

@米奇:现在是早上6点半,我无法回去睡觉。给我一个休息时间,男人! ;-) – 2009-09-20 10:31:15

1

这是根据你的问题

DECLARE @IsStocked bit 
Set @IsStocked=1 
Select * from Product 
Where LastSeen = Case When (@IsStocked=1) THEN GETDATE() - 30 
        Else LastSeen END 

希望这将有助于我的查询。