2016-12-30 1 views
0

У меня есть хранимая процедура, созданная кем-то еще. В пункте WHERE, есть выражение СЛУЧАЙ, что я с трудом, чтобы понять:Как перевести вложенное выражение CASE, чтобы понять логику?

DECLARE 
     @DateFrom datetime = '01-01-2016', 
     @DateTo datetime = '12-31-2016' 
     @EffDateFrom datetime = NULL, 
     @EffDateTo datetime = NULL, 
    /* SOME SELECT statement here */ 
WHERE  
      CASE WHEN @EffDateFrom IS NULL THEN 1 
          ELSE CASE WHEN dateDiff(d, '01-01-2016', dbo.tblQuotes.EffectiveDate) >= 0 
            AND dateDiff(d, EOMONTH (GETDATE()), dbo.tblQuotes.EffectiveDate) <= 0 Then 1 
            else 0 
            end 
          END = 1 

--------------/* This is where I am confused */-------------------------------- 

         AND CASE WHEN @DateFrom IS NULL THEN 1 ELSE 
          CASE WHEN INV.InvoiceDate > INV.EffectiveDate THEN 
           CASE WHEN dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0 
            AND dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0 Then 1 else 0 end 
          ELSE 
           CASE WHEN dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0 
            AND dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0 Then 1 else 0 end 
          END 
          END = 1 

Так что мы говорим здесь:

Когда параметр @DateFrom имеет нулевое значение, то используйте параметр @EffDateFrom , это правильно?

Но если его не равно нулю, то 1.Check если InvoiceDate больше EffectiveDate, и если это - то 2.check если число дней между 01-01-2016 и InvoiceDate больше или равно 0 AND если число дней между 12-31-2016 и InvoiceDate меньше или равно 0, а затем 1! Что такое 1? что означает, что запись действительна? Запись будет в таблице? Верный?

И ELSE 0 означает, что НЕ будет выбирать запись, правильно?

После этого я смущен. Обновлен понимание (если его правильно):

CASE WHEN @DateFrom IS NULL THEN 1 ELSE 

          CASE WHEN INV.InvoiceDate > INV.EffectiveDate THEN 
-----------------------------/*then check the below conditions and if its 1 then display the record if its 0 then do NOT */ 
             CASE WHEN dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0 
                AND dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0 THEN 1 ELSE 0 
             END 
----------------------------/* and this statement will only be working if parameter @EffDateFrom is not null. Correct? */ 
          ELSE 
           CASE WHEN dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0 
            AND dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0 Then 1 else 0 end 
          END 
          END = 1 

ответ

1

Это логика (в части вы спросили):

IF (@DateFrom IS NULL) 
    OR ((INV.InvoiceDate > INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0)) 
    OR ((INV.InvoiceDate <= INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
    OR ((INV.InvoiceDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
    OR ((INV.EffectiveDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
THEN TRUE 
ELSE FALSE 

Все заявление:

IF (@EffDateFrom IS NULL) 
    OR ((dateDiff(d, '01-01-2016', dbo.tblQuotes.EffectiveDate) >= 0) AND (dateDiff(d, EOMONTH (GETDATE()), dbo.tblQuotes.EffectiveDate) <= 0)) 
THEN TRUE 
ELSE FALSE 

AND 

IF (@DateFrom IS NULL) 
    OR ((INV.InvoiceDate > INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0)) 
    OR ((INV.InvoiceDate <= INV.EffectiveDate) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
    OR ((INV.InvoiceDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
    OR ((INV.EffectiveDate IS NULL) AND (dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0) AND (dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0)) 
THEN TRUE 
ELSE FALSE 
+0

OOOH !!! Большое спасибо, ребята. Удивительное объяснение! – Oleg

1

часть, которую вы могут быть истолкованы следующим образом без использования заявления о делах:

WHERE 
      @DateFrom IS NULL 

OR ( @DateFrom IS NOT NULL 
     AND INV.InvoiceDate > INV.EffectiveDate 
     AND dateDiff(d, '01-01-2016', INV.InvoiceDate) >= 0 
     AND dateDiff(d, '12-31-2016', INV.InvoiceDate) <= 0 
    ) 

OR ( @DateFrom IS NOT NULL 
     AND dateDiff(d, '01-01-2016', INV.EffectiveDate) >= 0 
     AND dateDiff(d, '12-31-2016', INV.EffectiveDate) <= 0 
    ) 
+0

A-ha !! Понял! Большое спасибо # M.Ali – Oleg

Смежные вопросы