2012-05-08 24 views
2

如何嵌入和if語句內的情況。這是我迄今爲止所擁有的。嵌入If語句內情

DECLARE @LDCCode as int 
     DECLARE @InvoiceDate as datetime 
     DECLARE @PaymentSemiMonthlyDays AS int 
     SET @LDCCode = 20 
     SET @InvoiceDate = '5/16/2012' 
     DECLARE @InvDateDayMonth AS INT 
     DECLARE @ReturnDate AS DATETIME 
     SET @ReturnDate = @InvoiceDate 
     DECLARE @PaymentDOM AS INT 
     DECLARE @PaymentDays AS INT 
     DECLARE @PaymentSemiMonthlyOffset AS INT 


SET @ReturnDate = CASE WHEN NOT @PaymentDOM IS NULL THEN 
    @ReturnDate + (@PaymentDOM - DATEPART(day, DateAdd(mm,1,@ReturnDate))) 
WHEN NOT @PaymentDays IS NULL THEN 
      DATEADD(Day,@PaymentDays,@ReturnDate) 
WHEN NOT @PaymentSemiMonthlyOffset IS NULL THEN      
    IF @LDCCode = 40 AND @InvDateDayMonth > 11 AND @InvDateDayMonth < 26 
     SELECT @ReturnDate + (@PaymentSemiMonthlyOffset - DATEPART(day, DateAdd(mm,1,@ReturnDate))) 
    ELSE 
     SELECT @ReturnDate + (@PaymentSemiMonthlyDays - DATEPART(day, DateAdd(mm,1,@ReturnDate)))  
    END 
+0

你究竟在做什麼? – n8wrl

+0

我想在案例中嵌入if語句。 if語句需要檢查LDCCode和InvoiceDateofMonth –

+0

如果使用內部表達式,則不能使用「if」是流控制關鍵字。將其轉換爲另一個案例陳述。 –

回答

2

不能合併以這種方式邏輯,但你可以添加一個嵌套CASE現有CASE聲明:

SET @ReturnDate = (CASE WHEN NOT @PaymentDOM IS NULL THEN 
    @ReturnDate + (@PaymentDOM - DATEPART(day, DateAdd(mm,1,@ReturnDate))) 
WHEN NOT @PaymentDays IS NULL THEN 
    DATEADD(Day,@PaymentDays,@ReturnDate) 
WHEN NOT @PaymentSemiMonthlyOffset IS NULL THEN 
    CASE WHEN @LDCCode = 40 AND @InvDateDayMonth > 11 AND @InvDateDayMonth < 26 THEN 
     @ReturnDate + (@PaymentSemiMonthlyOffset - DATEPART(day, DateAdd(mm,1,@ReturnDate))) 
    ELSE 
     @ReturnDate + (@PaymentSemiMonthlyDays - DATEPART(day, DateAdd(mm,1,@ReturnDate))) 
    END 
END) 

不過,如果這是一個存儲過程,我可能只是選擇更簡單IF/THEN/ELSE結構,而不是CASE

IF @PaymentDOM IS NULL 
    SET @ReturnDate = @ReturnDate + (@PaymentDOM - DATEPART(day, DateAdd(mm, 1, @ReturnDate))) 
ELSE IF NOT @PaymentDays IS NULL 
    SET @ReturnDate = DATEADD(Day,@PaymentDays,@ReturnDate) 
ELSE IF NOT @PaymentSemiMonthlyOffset IS NULL 
BEGIN 
    IF @LDCCode = 40 AND @InvDateDayMonth > 11 AND @InvDateDayMonth < 26 
     SET @ReturnDate = @ReturnDate + (@PaymentSemiMonthlyOffset - DATEPART(day, DateAdd(mm, 1, @ReturnDate))) 
    ELSE 
     SET @ReturnDate = @ReturnDate + (@PaymentSemiMonthlyDays - DATEPART(day, DateAdd(mm, 1, @ReturnDate))) 
END 
2

由於所有的表達式添加了一些@ReturnDate,因爲你以後@ReturnDate多次計算一個月的天,我認爲這是可以簡化爲:

DECLARE @Plus1M INT; 
SET @Plus1M = DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate)); 

SET @ReturnDate = DATEADD(DAY, 
    COALESCE(
    @PaymentDays, -- if @PaymentDays IS NULL, this will be skipped 
    @PaymentDOM - @Plus1M, -- if @PaymentDOM is NULL, this will be skipped 
    CASE WHEN @PaymentSemiMonthlyOffset IS NOT NULL THEN 
     CASE WHEN @LDCCode = 40 AND @InvDateDayMonth BETWEEN 12 AND 25 
     THEN @PaymentSemiMonthlyOffset 
     ELSE @PaymentSemiMonthlyDays 
     END - @Plus1M 
    END 
), 
    @ReturnDate 
); 

但是如果你想將它寫的冗長和重複表達,則:

SET @ReturnDate = CASE 
    WHEN @PaymentDOM IS NOT NULL THEN 
    DATEADD(DAY, @PaymentDOM 
    - DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate)), @ReturnDate) 
    WHEN @PaymentDays IS NOT NULL THEN 
    DATEADD(DAY, @PaymentDays, @ReturnDate) 
    WHEN @PaymentSemiMonthlyOffset IS NOT NULL THEN 
    CASE WHEN @LDCCode = 40 AND @InvDateDayMonth BETWEEN 12 AND 25 THEN 
     DATEADD(DAY, @PaymentSemiMonthlyOffset 
     - DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate)), @ReturnDate) 
    ELSE 
     DATEADD(DAY, @PaymentSemiMonthlyDays 
     - DATEPART(DAY, DATEADD(MONTH, 1, @ReturnDate)), @ReturnDate) 
    END 
    END; 

雖然難以驗證,因爲您現有的查詢沒有解析,而且您也沒有向我們展示示例數據或期望的結果。

我會避免使用@Datetime + INT速記寧願拼出DATEADD操作,因爲速記不與較新的類型(DATEDATETIME2等)工作。我也避免了像mm這樣的簡寫,因爲其中幾個縮寫是不明顯的。另外三個字符使得這更加明顯。 NOT ...something... IS NULL也不是非常直觀的閱讀。我寧願說「光線不是紅色」,而不是「光線不是紅色」。