2012-01-04 10 views
18

Estoy tratando de agregar una sentencia case o if en la cláusula where de mi consulta SQL.
Tengo una tabla de tiempos de viaje con fecha de inicio y finalización, y un campo booleano para cada día para indicar dónde se realiza el viaje ese día. Aquí es lo que tengo hasta ahora, pero estoy consiguiendo errores de sintaxis incorrectas:sentencia de caso en where cláusula - SQL Server

declare @date datetime 
set @Date = '05/04/2012' 
declare @day nvarchar(50) 
set @day = 'Monday' 

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) 
CASE WHEN @day = 'Monday' THEN 
AND (Monday = 1) 
WHEN @day = 'Tuesday' THEN 
AND (Tuesday = 1) 
ELSE 
AND (Wednesday = 1) 
END 
+2

A mi me parece como si usted tiene un problema de diseño en la mesa, No hay manera de que alguna vez tiene columnas Lunes, martes, miércoles, etc. Debes tener una columna de Daya y llenarla con el día que quieras o un valor numérico que sea una búsqueda del día que desees. Si es aplicable más de un día, utilice una tabla relacionada. – HLGEM

Respuesta

47

No es necesario case en la declaración where, sólo tiene que utilizar paréntesis y or:

Select * From Times 
WHERE StartDate <= @Date AND EndDate >= @Date 
AND (
    (@day = 'Monday' AND Monday = 1) 
    OR (@day = 'Tuesday' AND Tuesday = 1) 
    OR Wednesday = 1 
) 

Además, tu sintaxis es incorrecta para un caso. No agrega cosas a la cadena; devuelve un solo valor. Lo que quiere algo como esto, si estuviera realmente va a utilizar una declaración case (que no debe hacer):

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) 
AND 1 = CASE WHEN @day = 'Monday' THEN Monday 
      WHEN @day = 'Tuesday' THEN Tuesday 
      ELSE Wednesday 
     END 

Y sólo por un umph adicional, puede utilizar el operador between para su fecha:

where @Date between StartDate and EndDate 

la fabricación de su consulta final:

select 
    * 
from 
    Times 
where 
    @Date between StartDate and EndDate 
    and (
     (@day = 'Monday' and Monday = 1) 
     or (@day = 'Tuesday' and Tuesday = 1) 
     or Wednesday = 1 
    ) 
+0

Gracias Eric - eso es perfecto :) –

+0

@Eric Esto ralentizará la consulta –

5

simplemente haga lo select:

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) AND 
((@day = 'Monday' AND (Monday = 1)) 
OR (@day = 'Tuesday' AND (Tuesday = 1)) 
OR (Wednesday = 1)) 
+1

Sería rudo para mí votarte, pero puedes usar 'case' en la cláusula' where'. Simplemente no puedes usarlo como el OP intenta hacer. – Eric

+1

En Microsoft SQL Server, puede usar un 'CASE' en una cláusula' WHERE'. Pruebe esto - analiza y ejecuta muy bien (en SQL 2008 R2): "select * from sys.tables t where case when t.schema_id = 1 then 1 else 0 end = 1" – jklemmack

+0

@Eric gracias, entonces :) corregido: P –

1

Una declaración CASE es una expresión, al igual que una comparación booleana. Eso significa que la 'Y' tiene que ir antes de la declaración de 'caso', no dentro de ella .:

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) 

AND -- Added the "AND" here 

CASE WHEN @day = 'Monday' THEN (Monday = 1) -- Removed "AND" 
    WHEN @day = 'Tuesday' THEN (Tuesday = 1) -- Removed "AND" 
    ELSE AND (Wednesday = 1) 
END 
+0

Thx para editar Dylan. Debo haber estado canalizando a VB esta mañana. – jklemmack

+2

Hola, jklemmack, lo había intentado inicialmente y obtuve un error "Sintaxis incorrecta cerca de '='" en la línea superior de la declaración de caso. Todavía obtengo eso cuando ejecuto esta consulta –