如果声明内部案例嵌入

Int*_*eer 5 sql t-sql sql-server

如何在案例中嵌入和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 
Run Code Online (Sandbox Code Playgroud)

Cᴏʀ*_*ᴏʀʏ 6

您不能以这种方式组合逻辑,但您可以添加嵌套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)
Run Code Online (Sandbox Code Playgroud)

但是,如果这是在存储过程中,我可能只选择更简单的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
Run Code Online (Sandbox Code Playgroud)