2012-05-08 45 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也不是非常直观的阅读。我宁愿说“光线不是红色”,而不是“光线不是红色”。