SQL с условием где

У меня есть хранимая процедура 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, который является моим последним средством, но начинает выглядеть как ответ ...

Пожалуйста помоги..

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
8
0
11 652
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Заявление SQL:

SELECT *  
FROM orders  
WHERE orderdate BETWEEN @startdate AND @enddate  
AND (@Closed = 1 OR CLosedDate IS NOT NULL)

Остерегайтесь вопросов И / ИЛИ - вам нужны скобки!

Harper Shelby 09.12.2008 19:50
Ответ принят как подходящий

Попробуй это:

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. При этом ОЧЕНЬ важны круглые скобки для контроля порядка оценки.

Это отличный способ решить эту проблему. Спасибо за такой подход!

Noah 02.04.2009 20:15

Или это:

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))

двойной, снимается

Другие вопросы по теме