2014-11-02 61 views
0

如果變量是某個值,可以省略WHERE嗎?以下不起作用,我正在努力尋找答案;如果Var是確定值忽略WHERE

DECLARE @rMonth int, @rYear int, @sID int 
SET @rMonth = 0; 
SET @rYear = 0; 
SET @sID= 0; 

SELECT 
    TCS.bStatus AS jStatus, TCS.ID, TCS.sID, TCS.insDate, TCS.statusLabel, TCS.cID 
FROM 
    TCS 
    CASE WHEN @rMonth > 0 THEN 
     WHERE month(insDate) = @rMonth AND year(insDate) = @rYear 
END 
+1

如果你有一個大桌子,關心表現,你應該問另一個問題。你的'where'結構(和答案中的'where'語句)阻止使用索引。 – 2014-11-02 13:09:29

回答

2

這是常見的情況,包括一個條款有條件

檢查了這一點:

WHERE 
    (@rMonth = 0 OR MONTH(insDate) = @rMonth) 
AND (@rYear = 0 OR YEAR(insDate) = @rYear) 
AND (@sID = 0 OR sID = @sID) 

在上面的查詢和每個子句的「OR」是右側只適用於左手邊爲假的情況。否則,整個子句被認爲是真的,不會過濾任何行。
有希望的是,通過使用上面的技巧,任何複雜的子句都可以寫在「或」的右邊,而不是簡單的相等比較。

+0

有趣。我通常會看到用NULL做的,比如'WHERE(@rMonth IS NULL或MONTH(insDate)= @rMonth)' – 2014-11-02 20:32:44

+0

@JohnSaunders你是對的,將這些參數傳遞爲NULL聽起來更加標準。但他試圖將0視爲無,因此他的選擇:) – 2014-11-02 21:29:23

3
WHERE 
    (@rMonth <= 0) 
    OR 
    (month(insDate) = @rMonth AND year(insDate) = @rYear) 
+0

謝謝@GSerg。請在上面的答案中閱讀我的評論。當rMonth = 0時,我需要檢索所有記錄。 – DannyBoy 2014-11-02 13:22:29

+0

當rMonth = 0時,這將檢索所有記錄。 – GSerg 2014-11-02 13:26:05

0

另外兩個選項,以達到同樣的效果:

一個 - 用CASE語句像你想開始:

WHERE MONTH(insDate) = CASE WHEN @rMonth > 0 THEN @rMonth ELSE MONTH(insDate) END 
AND YEAR(insDate) = CASE WHEN @rYear > 0 THEN @rYear ELSE YEAR(insDate) END 
AND sID = CASE WHEN @sID > 0 THEN @sID ELSE sID END 

和另一個 - 使用ISNULLNULLIF功能:

​​