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