2013-04-15 4 views
2

У меня есть уже существующая процедура, которую мне нужно изменить, и очень упрощенно она написана аналогично приведенному ниже примеру.Применение предложения 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)?

+0

Посмотрите на этот пример: Http: // asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:237794600346808562 (BTW - это Oracle?) –

+0

Нет, его SQL Server. Это было в теге, но было отредактировано кем-то другим. – Jim

ответ

6

Хотя я не вижу ничего плохого в том, на самом деле имеет два отдельных запросов, если вы хотите использовать только один запрос, то вы можете сделать следующее:

SELECT SomeColumns 
FROM SomeTable 
WHERE StudentID = @StudentID 
AND (SubjectID = @SubjectID OR @SubjectID = 0) 
+0

Работает идеально. Благодаря! – Jim

+0

@Jim Нет проблем, хорошо, что это помогло вам – Lamak

+0

Еще раз спасибо! Просто FYI проблема с двумя отдельными запросами заключается в том, что в реальной процедуре запрос является огромным и сложным, и если нам нужно что-то изменить, нам придется изменить обе версии, сделав их более склонными копировать/вставлять ошибки , и т.д. – Jim