У меня есть хранимая процедура spGetOrders, которая принимает несколько параметров: @startdate и @enddate. Это запрашивает таблицу «Заказы». Один из столбцов в таблице называется ClosedDate. Этот столбец будет содержать NULL, если заказ не был закрыт, или значение даты, если оно было закрыто. Я хочу добавить параметр @Closed, который будет иметь битовое значение. В простом мире я бы смог ...
select * from orders o
where o.orderdate between @startdate AND @enddate
and (if @Closed = 1 then o.ClosedDate IS NULL else o.ClosedDate IS NOT NULL)
Очевидно, это не сработает ... Я также смотрю на динамический sql, который является моим последним средством, но начинает выглядеть как ответ ...
Пожалуйста помоги..


Заявление SQL:
SELECT *
FROM orders
WHERE orderdate BETWEEN @startdate AND @enddate
AND (@Closed = 1 OR CLosedDate IS NOT NULL)
Попробуй это:
select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 And o.ClosedDate IS NULL) Or (@Closed = 0 And o.ClosedDate IS NOT NULL))
Будьте осторожны при смешивании AND и OR в предложении where. При этом ОЧЕНЬ важны круглые скобки для контроля порядка оценки.
Это отличный способ решить эту проблему. Спасибо за такой подход!
Или это:
select * from orders o
where o.orderdate between @startdate AND @enddate
and ( (@Closed = 1 AND o.ClosedDate IS NULL)
OR (ISNULL(@Closed, 0) <> 1 AND o.ClosedDate IS NOT NULL)
)
Похоже, вы хотите, чтобы все заказы между двумя датами имели несовместимую информацию о закрытии. Другие предложения, вероятно, так же хороши (или лучше), но я почти уверен, что это работает и читается для меня (большинство других предложений появилось, когда я печатал).
Удачи!
В основном, выпишите это.
select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 and o.ClosedDate IS NULL)
or (@Closed != 1 and o.ClosedDate IS NOT NULL))
двойной, снимается
Остерегайтесь вопросов И / ИЛИ - вам нужны скобки!