SQL Condicional Donde

votos
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 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 dinámico, que es mi último recurso, pero empieza a parecerse a la respuesta.

Por favor ayuda..

Publicado el 09/12/2008 a las 17:42
fuente por usuario
En otros idiomas...                            


4 respuestas

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

Respondida el 09/12/2008 a las 17:48
fuente por usuario

votos
2

Declaración SQL:

SELECT *  
FROM orders  
WHERE orderdate BETWEEN @startdate AND @enddate  
AND (@Closed = 1 OR CLosedDate IS NOT NULL)
Respondida el 09/12/2008 a las 17:46
fuente por usuario

votos
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

Respondida el 09/12/2008 a las 17:50
fuente por usuario

votos
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 quiere todos los pedidos entre dos fechas 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!

Respondida el 09/12/2008 a las 17:48
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more