У меня есть таблица, которая собирает ответы от студентов.Я собираюсь запустить хранимую процедуру, чтобы получить все ответы студента и обработать все нумерацию страниц, сортировку и фильтрацию.Проблема, с которой я сталкиваюсь, связана с колонкой int, в которой будет храниться количество ненормативной лексики, найденной в их ответе.У меня будет фильтр с параметрами Да / Нет / Все, которые будут определять, хотите ли вы видеть ответы с ненормативной лексикой, без или с обоими.Я не уверен, как получить оператор case в моем предложении where, который может обрабатывать все 3 случая.
По сути, мне нужно что-то похожее на это, где я.@Profanity будет переменной, отправляемой в хранимую процедуру, которая будет иметь значение true, false или null.
WHERE
(
--OTHER FILTERS HERE
)
AND
(
CASE
-- if @profanity filter is true then we want all with counter greater than 0
WHEN @Profanity = '1' THEN R.ProfanitiesFound > '0'
-- else if @profanty filter is false then we want all with counter equal to 0
WHEN @Profanity = '0' THEN R.ProfanitiesFound = '0'
-- if nothing was sent in then just show all
WHEN (@Profanity IS NULL OR @Profanity = '') THEN R.ProfanitiesFound = R.Profanities
END
)
Не то, чтобы остальная часть запроса была необходима, но здесь она:
;WITH CTE_Results
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY
CASE WHEN @Column = 'Student' AND @Direction = 'asc' THEN u.LastName END asc,
CASE WHEN @Column = 'Student' AND @Direction = 'desc' THEN u.LastName END desc,
CASE WHEN @Column = 'Student' THEN u.FirstName END asc,
CASE WHEN @Column = 'Classroom' AND @Direction = 'asc' THEN c.Name END asc,
CASE WHEN @Column = 'Classroom' AND @Direction = 'desc' THEN c.Name END desc,
CASE WHEN @Column = 'Classroom' THEN u.LastName END asc,
CASE WHEN @Column = 'Lesson' AND @Direction = 'asc' THEN L.Name END asc,
CASE WHEN @Column = 'Lesson' AND @Direction = 'desc' THEN L.Name END desc,
CASE WHEN @Column = 'Lesson' THEN u.LastName END asc,
CASE WHEN @Column = 'Page' AND @Direction = 'asc' THEN P.PageNumber END asc,
CASE WHEN @Column = 'Page' AND @Direction = 'desc' THEN P.PageNumber END desc,
CASE WHEN @Column = 'Page' THEN L.Name END asc,
CASE WHEN @Column = 'QuestionType' AND @Direction = 'asc' THEN QT.Name END asc,
CASE WHEN @Column = 'QuestionType' AND @Direction = 'desc' THEN QT.Name END desc,
CASE WHEN @Column = 'QuestionType' THEN u.LastName END asc,
CASE WHEN @Column = 'Attempt' AND @Direction = 'asc' THEN R.Attempt END asc,
CASE WHEN @Column = 'Attempt' AND @Direction = 'desc' THEN R.Attempt END desc,
CASE WHEN @Column = 'Attempt' THEN u.LastName END asc,
CASE WHEN @Column = 'TotalScore' AND @Direction = 'asc' THEN R.TotalScore END asc,
CASE WHEN @Column = 'TotalScore' AND @Direction = 'desc' THEN R.TotalScore END desc,
CASE WHEN @Column = 'TotalScore' THEN u.LastName END asc,
CASE WHEN @Column = 'Created' AND @Direction = 'asc' THEN L.Name END asc,
CASE WHEN @Column = 'Created' AND @Direction = 'desc' THEN L.Name END desc,
CASE WHEN @Column = 'Created' THEN u.LastName END asc
) AS ROWNUM,
COUNT(*) OVER () AS TotalCount, C.Id AS 'ClassroomId', C.Name AS 'ClassroomName', U.Id AS 'UserId', U.LastName, U.FirstName, QT.Name AS 'QuestionType',
R.TotalScore, R.ProfanitiesFound, R.HasGaming, R.Created, R.Response, R.Attempt, R.IsPassingScore,
L.Name AS 'LessonName', P.PageNumber
FROM Responses R
INNER JOIN AspNetUsers U ON U.Id = R.UserId
INNER JOIN ClassroomUsers CU ON CU.UserId = U.Id
INNER JOIN Classrooms C ON C.Id = CU.ClassroomId
INNER JOIN Schools S ON S.Id = C.SchoolId
INNER JOIN Districts D ON D.Id = S.DistrictId
INNER JOIN Questions Q ON Q.Id = R.QuestionId
INNER JOIN QuestionTypes QT ON QT.Id = Q.QuestionTypeId
INNER JOIN Pages P ON P.Id = Q.PageId
INNER JOIN Lessons L ON L.Id = P.LessonId
WHERE
(
(@Filter IS NULL OR U.LastName LIKE LOWER('%'+@Filter+'%'))
OR (@Filter IS NULL OR U.FirstName LIKE LOWER('%'+@Filter+'%'))
OR (@Filter IS NULL OR L.Name LIKE LOWER('%'+@Filter+'%'))
OR (@Filter IS NULL OR QT.Name LIKE LOWER('%'+@Filter+'%'))
)
AND
(
U.Id = CASE WHEN (@Student <> '' AND @Student IS NOT NULL) THEN @Student ELSE U.Id END AND
D.Id = CASE WHEN (@District <> '' AND @District IS NOT NULL) THEN @District ELSE D.Id END AND
S.Id = CASE WHEN (@School <> '' AND @School IS NOT NULL) THEN @School ELSE S.Id END AND
C.Id = CASE WHEN (@Classroom <> '' AND @Classroom IS NOT NULL) THEN @Classroom ELSE C.Id END AND
QT.Id = CASE WHEN (@QuestionType <> '' AND @QuestionType IS NOT NULL) THEN @QuestionType ELSE QT.Id END AND
Q.Id = CASE WHEN (@Question <> '' AND @Question IS NOT NULL) THEN @Question ELSE Q.Id END AND
L.Id = CASE WHEN (@Lesson <> '' AND @Lesson IS NOT NULL) THEN @Lesson ELSE L.Id END AND
R.HasGaming = CASE WHEN (@Gaming <> '' AND @Gaming IS NOT NULL) THEN @Gaming ELSE R.HasGaming END
)
AND
(
--TODO: WOULD EVENTUALLY LIKE TO MAKE THESE FILTERS NOT REQUIRED
R.TotalScore >= @FirstScore AND R.TotalScore <= @SecondScore
)
AND
(
CASE
-- if @profanity filter is true then we want all with counter greater than 0
WHEN @Profanity = '1' THEN R.ProfanitiesFound > '0'
-- else if @profanty filter is false then we want all with counter equal to 0
WHEN @Profanity = '0' THEN R.ProfanitiesFound = '0'
-- if nothing was sent in then just show all
WHEN (@Profanity IS NULL OR @Profanity = '') THEN R.ProfanitiesFound = R.Profanities
END
)
)
SELECT TotalCount, ClassroomId, ClassroomName, UserId, LastName, FirstName, QuestionType, TotalScore, ProfanitiesFound, HasGaming, Created, Response, Attempt, IsPassingScore, LessonName, PageNumber
FROM CTE_Results
WHERE ROWNUM > @FirstRec AND ROWNUM < @LastRec