如何翻译嵌套的 CASE 表达式以理解逻辑?
How to translate nested CASE expression in order to understand the logic?
我有一个由其他人创建的存储过程。在 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为null时,再使用参数@EffDateFrom,对吗?
但是如果它不为空,那么
1.check 如果 InvoiceDate 大于 EffectiveDate,并且如果是 - 那么
2.check 如果 01-01-2016
和 InvoiceDate 之间的天数大于或等于 0 AND
如果 12-31-2016
和 InvoiceDate 之间的天数小于或等于 0 那么 1! !什么是 1?意味着记录有效?记录将在 table?正确吗?
和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
这是逻辑(你问的部分):
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
你感到困惑的部分可以在不使用 case 语句的情况下解释为:
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
)
我有一个由其他人创建的存储过程。在 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为null时,再使用参数@EffDateFrom,对吗?
但是如果它不为空,那么
1.check 如果 InvoiceDate 大于 EffectiveDate,并且如果是 - 那么
2.check 如果 01-01-2016
和 InvoiceDate 之间的天数大于或等于 0 AND
如果 12-31-2016
和 InvoiceDate 之间的天数小于或等于 0 那么 1! !什么是 1?意味着记录有效?记录将在 table?正确吗?
和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
这是逻辑(你问的部分):
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
你感到困惑的部分可以在不使用 case 语句的情况下解释为:
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
)