SQL Condicional Donde

Tengo un procedimiento almacenado llamado spGetOrders que acepta algunos parameters: @startdate y @enddate. Esto consulta una tabla de "Pedidos". Una de las columnas de la tabla se llama "ClosedDate". Esta columna mantendrá NULL si un pedido no se ha cerrado o un valor de date si lo tiene. Me gustaría agregar un parámetro @Closed que tendrá un valor de bit. En un mundo simple, podría hacer …

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) 

Obviamente, eso no va a funcionar. También estoy buscando un sql dynamic, que es mi último recurso, pero empieza a parecerse a la respuesta.

Por favor ayuda..

Prueba esto:

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

Tenga cuidado con la mezcla de AND y OR en la cláusula where. Al hacer esto, el paréntesis para controlar el order de evaluación es MUY importante.

Declaración SQL:

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

O esto:

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

Parece que quiere todos los pedidos entre dos dates que tienen información de cierre incoherente. Las otras sugerencias son probablemente tan buenas (o mejores), pero estoy bastante seguro de que esto funciona y me resulta legible (la mayoría de las otras sugerencias aparecieron mientras escribía).

¡Buena suerte!

Básicamente, escríbalo.

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

doble, se puede quitar