2012-09-11 183 views
3

我有一個大的存儲過程來爲報表提取數據。我試圖根據特定標準在WHERE子句中使用兩個不同值中的一個。我無法弄清楚如何使用CASE聲明來完成這件事,我不斷收到在THEN部分的錯誤。下面是我想要做的,它是較大存儲過程的一小部分。所以,我在找的是哪裏dlp(DATETIME)dlc(DATETIME)我想用dlp@AgeStart@AgeEnd參數來評估,如果沒有的話用dlc@AgeStart@AgeEnd評估新。在where子句中使用case語句創建查詢

@AgeStart INT 
@AgeEnd INT 

SET @Recovery = (
SELECT SUM(ISNULL(M.Paid1, 0)) 
FROM Master AS M 
WHERE M.Status IN ('xxx','yyy') 
    AND CASE 
    WHEN COALESCE(M.dlp, '2000-01-01 00:00:00') > 
     COALESCE(M.dlc, '2000-01-01 00:00:00') 
    THEN DATEDIFF(dd,M.Received,M.dlp) 
     >= @AgeStart AND DATEDIFF(dd,M.Received,M.dlp) <= @AgeEnd 
    ELSE DATEDIFF(dd, M.dlc, M.Received) 
     >= @AgeStart AND DATEDIFF(dd, M.dlc, M.Received) <= @AgeEnd 
    END 
    AND M.Balance >= @OrigBalanceMin AND M.Balance <= @OrigBalanceMax 
) 

回答

1

你並不需要一個case語句,你可以窩在他們括號並使用OR條件。我想我得到了我所有的括號一字排開:

WHERE M.Status IN ('xxx','yyy') 
    AND 
    /* Your updated case statement starts here */ 
    (
     (
      COALESCE(M.dlp, '2000-01-01 00:00:00') > 
       COALESCE(M.dlc, '2000-01-01 00:00:00') AND 
      DATEDIFF(dd,M.Received,M.dlp) >= @AgeStart AND 
       DATEDIFF(dd,M.Received,M.dlp) <= @AgeEnd 
     ) OR (
      COALESCE(M.dlp, '2000-01-01 00:00:00') <= 
       COALESCE(M.dlc, '2000-01-01 00:00:00') AND 
      DATEDIFF(dd, M.dlc, M.Received) >= @AgeStart AND 
       DATEDIFF(dd, M.dlc, M.Received) <= @AgeEnd 
     ) 
    ) 
    /* Your updated case statement ends here */ 
    AND M.Balance >= @OrigBalanceMin AND M.Balance <= @OrigBalanceMax 
) 
+0

好東西,我是過於複雜的問題。謝謝你們的幫助! –