2012-05-08 5 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는 flow-control 키워드입니다. 그것을 다른 case 문으로 변환하십시오. –

답변

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 여러 번 후 그 달의 날짜를 계산하기 때문에,이 간소화 될 수 있다고 생각과 같은 :

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 속기를 사용하지 않는 것 그리고 속기는 새로운 유형 (DATE, DATETIME2 등)이 작동하지 않기 때문에 오히려 DATEADD 작업을 맞추는 것입니다. 나는 또한 이러한 축약어 중 일부가 명확하지 않기 때문에 mm과 같은 축약을 피할 것입니다. 세 명 이상의 캐릭터가 훨씬 더 분명합니다. 또한 NOT ...something... IS NULL은 매우 직관적으로 읽을 수 없습니다. 차라리 "빛이 빨갛지 않다"는 말보다는 "빛이 빨갛다"라고 말하고 싶습니다.

관련 문제