Продолжите и разрешите пустые значения, что означает, что фильтр не должен применяться. Затем вы можете использовать следующее:
SELECT *
FROM mytable myt
WHERE COALESCE(myt.date, '1/1/1900') between COALESCE(@BeginDate, myt.date, '1/1/1900') and COALESCE(@EndDate, myt.date, '1/1/1900')
AND COALESCE(YEAR(myt.date), -1) = COALESCE(@Year, YEAR(myt.date), -1)
AND COALESCE(myt.partnumber, -1) = COALESCE(@PartNumber, myt.partnumber, -1)
В итоге, если какое-либо значение переменной равно NULL, сравните значение столбца с самим собой, что фактически игнорирует условие. Более конкретно, при тестировании myt.date
, если @BeginDate
равно NULL, установите нижнее значение диапазона равным значению myt.date
. Сделайте ту же замену со значением @EndDate
. Даже если @BeginDate
и @EndDate
равны NULL, условие будет истинным.
Аналогичный подход используется для YEAR(myt.date)
и myt.partnumber
. Если значение переменной равно NULL, сравните значение столбца с самим собой, что всегда равно true.
UPDATE:
Добавлено значение по умолчанию для каждого COALESCE
для обработки ситуации, когда значение столбца равно NULL.