2012-01-04 16 views
18

Próbuję dodać case lub instrukcję w klauzuli where mojego zapytania SQL.
Mam tabelę czasów przejazdu z datą początkową i końcową oraz polem boolowskim dla każdego dnia, aby wskazać miejsce podróży w danym dniu. Oto co mam tak daleko, ale jestem coraz nieprawidłowe błędy składni:case statement w klauzuli Where - 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

Wygląda mi się, jeśli masz problem z projektu na stole, nie ma tak powinno kiedykolwiek kolumny Poniedziałek, wtorek, środa, itd. Możesz wyświetlać dzienną kolumnę i wypełniać ją wybranym dniem lub wartością numeryczną, która jest odnośnikiem do dnia, w którym chcesz. Jeśli obowiązuje więcej niż jeden dzień, użyj odpowiedniej tabeli. – HLGEM

Odpowiedz

47

Nie trzeba case w rachunku where, wystarczy użyć nawiasów i 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 
) 

dodatkowo, Twoja składnia jest błędna w przypadku. Nie dołącza elementów do łańcucha - zwraca pojedynczą wartość. że chcesz coś takiego, jeśli zostały rzeczywiście zamiar użyć case oświadczenie (które nie powinny):

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 

i po prostu za dodatkową umph, można użyć operatora between dla terminu:

where @Date between StartDate and EndDate 

podjęciem ostatecznej zapytanie:

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

Dzięki Eric - to jest idealne :) –

+0

@Eric To spowolni kwerendę –

5

prostu wykonaj 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

Byłoby nieokrzesanie, bym ci zajął, ale możesz użyć 'case' w klauzuli' where'. Po prostu nie możesz tego użyć, tak jak próbuje to zrobić OP. – Eric

+1

W Microsoft SQL Server, można rzeczywiście użyć "CASE" w klauzuli "WHERE". Wypróbuj to - przetwarza i wykonuje poprawnie (na SQL 2008 R2): "wybierz * z sys.tables t gdzie przypadek, gdy t.schema_id = 1 to 1 else 0 end = 1" – jklemmack

+0

@Eric thanks then :) naprawiono: P –

1

CASE oświadczenie jest wyrazem, podobnie jak logiczna porównania. Oznacza to, że „I” musi iść przed „przypadek” oświadczenie, nie w nim .:

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 dla edycji Dylan. Pewnie rano musiałem przekazywać VB. – jklemmack

+2

Witam jklemmack, próbowałem tego na początku i otrzymałem komunikat "Nieprawidłowa składnia w pobliżu" = "" w górnym wierszu instrukcji case. Wciąż otrzymuję to, gdy wykonuję to zapytanie –