Возврат условия из выражения case в предложении where (Ошибка – Неправильный синтаксис рядом с ‘

Вопрос или проблема

В SQL у меня возникает ошибка

Некорректный синтаксис рядом с ‘<‘.

SELECT *
FROM TableName
WHERE CStatus="Active"
AND ServiceStatus="Active"
AND DATEDIFF(day, OnDate, OffDate) > 0
AND CASE WHEN EOMONTH(CA.OnDate) = 31 THEN DATEDIFF(day, OnDate, OffDate) <= 31 ELSE DATEDIFF(day, OnDate, OffDate) <= 30 END

Я пытаюсь вставить конструкцию CASE в мое условие WHERE, но получаю ошибку:

Некорректный синтаксис рядом с ‘>’.

Я хочу сравнить, если месяц OnDate имеет 31 день, тогда 31 день, иначе 30 дней.

Ответ или решение

Когда вы сталкиваетесь с ошибкой "Incorrect syntax near ‘<‘" при использовании выражения CASE в WHERE-классе SQL, это часто указывает на проблему с форматированием логического выражения. Давайте подробно разберем вашу проблему и предложим правильное решение.

Анализ текущего запроса

Ваш SQL-запрос выглядит следующим образом:

SELECT *
FROM TableName
WHERE CStatus = "Active"
AND ServiceStatus = "Active"
AND DATEDIFF(day, OnDate, OffDate) > 0
AND CASE WHEN EOMONTH(CA.OnDate) = 31 THEN DATEDIFF(day, OnDate, OffDate) <= 31 ELSE DATEDIFF(day, OnDate, OffDate) <= 30 END

Проблема с конструкцией CASE

Ваша попытка использовать конструкцию CASE в WHERE-классе неверна. В SQL конструкция CASE возвращает значение, а не логическое условие. То есть, вам необходимо вернуть True или False, а не результат вычисления, чтобы правильно использовать его в условии WHERE.

Правильный подход

Чтобы правильно провести проверку, используйте конструкцию IF-ELSE (или AND/OR) вместо CASE. Вот как можно переписать ваш запрос:

SELECT *
FROM TableName
WHERE CStatus = 'Active'
AND ServiceStatus = 'Active'
AND DATEDIFF(day, OnDate, OffDate) > 0
AND (
    (EOMONTH(OnDate) = '2023-01-31' AND DATEDIFF(day, OnDate, OffDate) <= 31)
    OR 
    (EOMONTH(OnDate) <> '2023-01-31' AND DATEDIFF(day, OnDate, OffDate) <= 30)
)

Примечания:

  1. Проверка на 31 день: Убедитесь, что вы используете правильный флаг для проверки последнего дня месяца.
  2. Используйте одинарные кавычки для строк: В SQL стандартом является использование одинарных кавычек для строковых значений ('Active' вместо "Active").
  3. Проверьте тип данных: Убедитесь, что поля CStatus и ServiceStatus (и другие поля) имеют соответствующий тип данных, чтобы избежать дополнительных ошибок.

Заключение

Используя правильные логические операторы и условия, вы сможете избежать синтаксических ошибок и добиться желаемого результата. Если у вас есть дополнительные вопросы или вам требуется помощь с другими аспектами SQL-запросов, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...