when and sql conditional where

and - SQL Condicional Donde



sql case comparison (4)

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

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


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!


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.


Declaración SQL:

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