Несколько инструкций в предложении where

#sql #tsql #sql-server-2017

#sql #tsql #sql-server-2017

Вопрос:

Я пытаюсь создать предложение where, в котором есть 2 оператора, которые работают вместе, а затем отдельный оператор, который работает сам по себе, если он соответствует определенным критериям

Я пробовал операторы CASE, AND, OR, и все равно ничего не работает

 WHERE HB.CreatedByDate = @ReportDateN AND HB.Date = @ReportDateN - 1
  

Итак, этот код является моим текущим предложением where, которое возвращает мне результаты, у которых CreatedByDate равен переменной @ReportDateN, но также имеет обычную дату, равную переменной @ReportDateN, за исключением того, что она минусует один день.

Это само по себе делает то, что я хочу, но я хотел бы добавить еще кое-что.

Я хочу сделать так, чтобы, если переменная с именем @WeekDay = ‘Monday’ затем вычитала 3 из @ReportDateN во второй части вместо просто 1.

Любая помощь будет оценена, спасибо!

Комментарии:

1. Просто замените 1 на CASE @WeekDay WHEN 'Monday' THEN 3 ELSE 1 END

Ответ №1:

    WHERE HB.CreatedByDate = @ReportDateN
     AND HB.DATE = CASE 
        WHEN @Weekday = 'Monday'
            THEN (@ReportDateN - 3)
        ELSE (@ReportDateN - 1)
         END
  

Это также может быть сделано путем объединения операторов OR

 WHERE HB.CreatedByDate = @ReportDateN AND 
      (
       @Weekday = 'Monday' AND HB.Date = (@ReportDateN - 3) 
      )
   OR
      (
        @Weekday != 'Monday' AND HB.Date = (@ReportDateN - 1) 
      )
  

Просто для справки, обратите внимание, что следующее не будет работать:

  WHERE CASE @Weekday = 'Monday' THEN .... ELSE ..... END 
  

РЕДАКТИРОВАТЬ: Согласно комментарию op ниже:

 WHERE HB.CreatedByDate = @ReportDateN AND 
      (
       @Weekday = 'Monday' AND (
                                HB.Date = (@ReportDateN - 3) OR
                                HB.Date = (@ReportDateN - 2) OR
                                HB.Date = (@ReportDateN - 1) 
                               )  
      )
   OR
      (
        @Weekday != 'Monday' AND HB.Date = (@ReportDateN - 1) 
      )
  

Комментарии:

1. Спасибо вам за вашу помощь и всем остальным. Это работает так, как я прошу, но я хотел бы, возможно, добавить еще одну вещь. Возможно ли получить результаты в промежутке между 3 днями, которые я забираю, если вы меня поймете? Итак, скажем, что сегодня понедельник, и я отнимаю 3 дня, чтобы добраться до пятницы. Смогу ли я получить результаты в субботу и воскресенье? Еще раз спасибо за вашу помощь!

2. @ChungWill Я обновил одно из решений, которые я предоставил выше. Если вы хотели бы использовать другое решение, которое я предоставил, я предлагаю вам поиграть с ним самостоятельно и вернуться, если вам понадобится помощь.

3. Отлично, большое вам спасибо. Я все еще только начинаю изучать SQL и иногда, пытаясь найти правильную логику для выполнения того, что я хочу сделать, сбивает меня с толку, так что спасибо!

Ответ №2:

Как насчет этого :

 WHERE
     HB.CreatedByDate = @ReportDateN AND
     (
        @WeekDay = 'Monday' AND HB.Date = @ReportDateN - 3
        OR
        HB.Date = @ReportDateN - 1
    )