Подтвердить что ты не робот

Case statement в where where - SQL Server

Я пытаюсь добавить оператор case или if в предложение where моего SQL-запроса.
У меня есть таблица времени поездки с датой начала и окончания и логическое поле для каждого дня, чтобы указать, где происходит путешествие в этот день. Вот что я до сих пор, но я получаю неправильные синтаксические ошибки:

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 
4b9b3361

Ответ 1

Вам не нужно case в инструкции where, просто используйте круглые скобки и 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
)

Кроме того, ваш синтаксис неверен для случая. Он не добавляет вещи в строку - он возвращает одно значение. Вам нужно что-то подобное, если вы действительно собираетесь использовать инструкцию case (которой вы не должны):

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 

И только для дополнительной umph вы можете использовать оператор between для вашей даты:

where @Date between StartDate and EndDate

Выполнение окончательного запроса:

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

Ответ 2

просто выполните 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))

Ответ 3

Оператор

A CASE - выражение, как и булево сравнение. Это означает, что "И" нужно выполнить перед оператором "CASE", а не внутри него.:

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