Sql server 如何翻译嵌套的CASE表达式以理解逻辑?

Sql server 如何翻译嵌套的CASE表达式以理解逻辑?,sql-server,tsql,case,datediff,Sql Server,Tsql,Case,Datediff,我有一个由其他人创建的存储过程。在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表达式我很难理解:

 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
这是(你问的部分)的逻辑:

IF(@DateFrom为空)
或者((INV.InvoiceDate>INV.EffectiveDate)和(dateDiff(d,'01-01-2016',INV.InvoiceDate)>=0)和(dateDiff(d,'12-31-2016',INV.InvoiceDate)=0)和(dateDiff(d,'12-31-2016',INV INV.InvoiceDate)这是(您所问部分的)逻辑:

IF(@DateFrom为空)

或者((INV.InvoiceDate>INV.EffectiveDate)和(dateDiff(d,'01-01-2016',INV.InvoiceDate)>=0)和(dateDiff(d,'12-31-2016',INV.InvoiceDate)=0)和(dateDiff(d,'12-31-2016',INV INV.InvoiceDate)您感到困惑的部分可以在不使用案例陈述的情况下解释为:

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
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 
     )
在哪里
@DateFrom为空
或(@DateFrom不为空
和INV.InvoiceDate>INV.EffectiveDate
和日期差异(d,'01-01-2016',发票日期>=0
和日期差异(d,'12-31-2016',投资发票日期)=0

和dateDiff(d,'12-31-2016',INV.EffectiveDate)您感到困惑的部分可以在不使用案例陈述的情况下解释为以下内容:

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
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 
     )
在哪里
@DateFrom为空
或(@DateFrom不为空
和INV.InvoiceDate>INV.EffectiveDate
和日期差异(d,'01-01-2016',发票日期>=0
和日期差异(d,'12-31-2016',投资发票日期)=0

和dateDiff(d,'12-31-2016',INV.EffectiveDate)A-ha!!明白了!非常感谢#M.AliA-ha!!明白了!非常感谢#M.Ali