Я работаю над хранимой процедурой для академического учреждения, которая позволила бы советникам фильтровать свои списки студентов по ряду критериев. Недавно консультанты попросили меня дать им возможность фильтровать студентов по GPA. Это было очень легко, пока они не попросили вариант определения неравенства.
Вот усеченная копия используемого мной запроса и соответствующее сообщение об ошибке в SQL.
DECLARE @Inequality CHAR(2)
SET @Inequality = '>='
DECLARE @Gpa DECIMAL(3,1)
SET @Gpa = 2.0
SELECT DISTINCT
mem.StudentID,
SUM(GradePointValue * Credits) / SUM(Credits) AS GPA
FROM <snip>
WHERE <snip>
GROUP BY mem.StudentID
HAVING
CASE @Inequality
WHEN '>=' THEN SUM(GradePointValue * Credits) / SUM(Credits) >= @Gpa
WHEN '>' THEN SUM(GradePointValue * Credits) / SUM(Credits) > @Gpa
WHEN '<' THEN SUM(GradePointValue * Credits) / SUM(Credits) < @Gpa
WHEN '<=' THEN SUM(GradePointValue * Credits) / SUM(Credits) <= @Gpa
END
ORDER BY GPA desc
Когда я пытаюсь выполнить этот запрос, SSMS выдает мне следующее сообщение об ошибке: Incorrect syntax near '>'.
, ссылаясь на первую строку оператора CASE
в предложении HAVING
, >= @GPA
Я пытался переписать предложение HAVING
на:
HAVING SUM(GradePointValue * Credits) / SUM(Credits)
CASE @Inequality
WHEN '>=' THEN >=
...
END @Gpa
Это приводит к другому сообщению об ошибке: Incorrect syntax near the keyword 'CASE'.
Я знаю, что могу копировать и вставлять весь SQL-запрос четыре раза и изменять только неравенство в предложении HAVING
в каждом запросе, но это грязно (не то, чтобы это не так - просто не пахнет как плохо для меня) и я хотел бы избежать этого, если смогу. Можно ли как-нибудь осуществить мою попытку выше?