SQL Условный Где - PullRequest
       9

SQL Условный Где

8 голосов
/ 09 декабря 2008

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

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

Ответы [ 4 ]

14 голосов
/ 09 декабря 2008

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

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

2 голосов
/ 09 декабря 2008

SQL-оператор:

SELECT *  
FROM orders  
WHERE orderdate BETWEEN @startdate AND @enddate  
AND (@Closed = 1 OR CLosedDate IS NOT NULL)
0 голосов
/ 09 декабря 2008

В основном, запишите это.

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

двойной, может быть удален

0 голосов
/ 09 декабря 2008

Или это:

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

Похоже, вы хотите, чтобы все заказы между двумя датами имели противоречивую информацию о закрытии. Другие предложения, вероятно, так же хороши (или лучше), но я уверен, что это работает и доступно для чтения (большинство других предложений появилось, когда я печатал).

Удачи!

...