У меня есть хранимая процедура, созданная кем-то еще. В пункте 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
OOOH !!! Большое спасибо, ребята. Удивительное объяснение! – Oleg