[英]Embed If Statement Inside Case
如何在案例中嵌入和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
您不能以這種方式組合邏輯,但您可以在現有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
由於所有表達式都向@ReturnDate
添加了一些@ReturnDate
,並且由於您在@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
操作,因為速記不適用於較新的類型( DATE
, DATETIME2
等)。 我也避免使用mm
這樣的速記,因為這些縮寫中有幾個是不明顯的。 另外三個字符使得更加明顯。 還有NOT ...something... IS NULL
讀起來不是很直觀。 我寧願說“光不是紅”而不是“不是光是紅的”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.