#sql #sql-server #stored-procedures
#sql #sql-server #хранимые процедуры
Вопрос:
У меня есть эта хранимая процедура:
CREATE PROCEDURE ListIds
@ObjectiveId int,
@SubjectId int,
AS
BEGIN
SELECT Question.QuestionUId
FROM Objective
WHERE Objective.objectiveId = @ObjectiveId
AND Objective.subjectId = @SubjectId
END;
Как я могу сделать так, чтобы, если хранимая процедура @ObjectiveId равна 0, она не выбиралась на основе objectiveId из таблицы. Однако я хочу все время выбирать идентификатор субъекта.
Комментарии:
1. Что он должен выбрать вместо этого, если оно равно 0?
2. Просто выберите на основе SubjectID
Ответ №1:
SELECT Question.QuestionUId
FROM Objective
WHERE (Objective.objectiveId = @ObjectiveId OR @ObjectiveId = 0)
AND Objective.subjectId = @SubjectId
Ответ №2:
CREATE PROCEDURE ListIds
@ObjectiveId int,
@SubjectId int,
AS
BEGIN
SELECT Question.QuestionUId
FROM Objective
WHERE Objective.objectiveId = case when @ObjectiveId = 0 then Objective.objectiveId
else ObjectiveId end
AND Objective.subjectId = @SubjectId
END;
Комментарии:
1. Это не будет работать, когда
Objective.objectiveId
естьnull
.2. затем обработайте случай для этого isnull(c,»)= »
Ответ №3:
CREATE PROCEDURE ListIds
@ObjectiveId int,
@SubjectId int,
AS
BEGIN
SELECT Question.QuestionUId
FROM Objective
WHERE (ObjectiveId = 0 OR Objective.objectiveId = @ObjectiveId)
AND Objective.subjectId = @SubjectId
END;
Комментарии:
1. -1 Это неверно, поскольку он хочет всегда фильтровать по
SubjectId
: «Я хочу все время выбирать по идентификатору объекта» . Вы фильтруете только в том случае, еслиObjectiveId <> 0
это также неверно, поскольку он хочет пропуститьObjectiveId
фильтр, только если параметр равен 0.
Ответ №4:
Попробуй это:
CREATE PROCEDURE ListIds
@ObjectiveId INT,
@SubjectId INT
AS
BEGIN
SELECT QuestionUId
FROM Objective
WHERE Objective.subjectId = @SubjectId AND
(ISNULL(@ObjectiveId,0) = 0 OR Objective.objectiveId = @ObjectiveId)
END;