SQL логические переменные в где
Я делаю отчет rdl, и у меня есть три флажка, которые, если проверено, должны изменить мое утверждение WHERE. Если ничего не отмечено, результат должен совпадать только по диапазону дат. Если один или несколько проверены, он должен вернуть поля, соответствующие переменным, соответствующим строке.
WHERE
(EffectiveDate BETWEEN @StartDate AND @EndDate)
AND (((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)
AND ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0)
AND ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0))
Мой код работает до сих пор, когда ни один не проверен, и когда один проверен, но ничего не возвращает, когда было установлено более одного флажка. Таким образом, чтобы попытаться исправить это, я изменил код этого
WHERE
(EffectiveDate BETWEEN @StartDate AND @EndDate)
AND ((((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)
OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0)
OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0)))
В результате все строки возвращались независимо от того, что было выбрано. Может кто-нибудь сказать мне, где я иду не так?
3 ответа
Я считаю, что это правильная перестановка. Более сложная проблема, чем кажется на первый взгляд. Проблема заключалась в разделении линий, таких как ((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)
с AND
означало, что если бы два включения были верны, строка должна иметь оба PrefixId
Это не может произойти. И если вы разделили их OR
, тогда наличие только одного включения false означает, что каждая строка пройдет. Поэтому вместо этого убедитесь, что строка имеет префикс любого включенного, иначе все включения должны быть отключены.
WHERE EffectiveDate BETWEEN @StartDate AND @EndDate
AND
(
(@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR
(@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR
(@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR
(@IncludeSEWPrefix = 0 AND @IncludePAWPrefix = 0 AND @IncludeRPLPrefix = 0)
)
Попробуй это
WHERE
(EffectiveDate BETWEEN @StartDate AND @EndDate)
AND
(
(@IncludeSEWPrefix = 1 AND PrefixId = 'SEW' OR @IncludeSEWPrefix = 0) AND
(@IncludePAWPrefix = 1 AND PrefixId = 'PAW' OR @IncludePAWPrefix = 0) AND
(@IncludeRPLPrefix = 1 AND PrefixId = 'RPL' OR @IncludeRPLPrefix = 0)
)
У вас больше скобок, чем нужно, это не больно, а просто знайте. Может быть, это может помочь:
WHERE (EffectiveDate BETWEEN @StartDate AND @EndDate)
AND ( ((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR (@IncludeSEWPrefix = 0 AND @PrefixId <> 'SEW'))
OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR (@IncludePAWPrefix = 0 AND @PrefixId <> 'PAW'))
OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR (@IncludeRPLPrefix = 0 AND @PrefixId <> 'RPL'))
)