2009-09-20 28 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 

希望這將有助於我的查詢。