2008-12-09 11 views
8

Tengo un procedimiento almacenado llamado spGetOrders que acepta algunos parámetros: @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 fecha si lo tiene. Me gustaría agregar un parámetro @Closed que tendrá un valor de bit. En un mundo sencillo, me gustaría ser capaz de hacer ..SQL Conditional Donde

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 mirando SQL dinámico que es mi último recurso, pero empezando a parecerse a la Declaración de respuesta ..

Por favor, ayuda ..

Respuesta

14

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 al mezclar AND y OR en la cláusula where. Al hacer esto, el paréntesis para controlar el orden de evaluación es MUY importante.

+1

Esta es una excelente manera de solucionar este problema. Gracias por este enfoque! – Noah

2

SQL:

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

Ojo con su Y/O problemas - que necesita paréntesis! –

0

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 desea que todos los pedidos entre dos fechas que tienen información Cerrar inconsistente. 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!

0

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