У меня есть уже существующая процедура, которую мне нужно изменить, и очень упрощенно она написана аналогично приведенному ниже примеру.Применение предложения WHERE условно в запросе SQL
Процедура передается в @StudentID и @SubjectID, а если @SubjectID = 0, он выполняет запрос без фильтрации на SubjectID вообще, в противном случае он выполняет тот же самый запрос, но фильтрует на SubjectID.
CREATE PROCEDURE SomeProcedure
@StudentID INT,
@SubjectID INT
AS
BEGIN
IF(@SubjectID = 0)
BEGIN
SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
END
BEGIN
SELECT SomeColumns
FROM SomeTable
WHERE StudentID = @StudentID
AND SubjectID = @SubjectID
END
END
Это кажется мне смешным; теперь мы должны поддерживать две копии одного и того же запроса; который фильтрует объект SubjectID, а другой - нет. Я не контролирую тот факт, что приложение ожидает передать SubjectID = 0, чтобы получить результаты для всех предметов.
Учитывая, что я не могу изменить подпись процедуры, как я могу ее переписать, чтобы она не требовала двух отдельных запросов?
Я попытался использовать оператор CASE в предложении WHERE, но я не могу понять, как условно включить части предиката WHERE.
английский перевод этой проблемы «IF @SubjectID = 0, возвращают результаты с любым значением SomeTable.SubjectID, ELSE возвращать только результаты, где SomeTable.SubjectID = @SubjectID»
Как я могу добиться этого в единый запрос (и, пожалуйста, никаких динамических предложений SQL)?
Посмотрите на этот пример: Http: // asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:237794600346808562 (BTW - это Oracle?) –
Нет, его SQL Server. Это было в теге, но было отредактировано кем-то другим. – Jim