Как я могу сделать так, чтобы предложение where со значением 0 не позволяло проверять where в хранимой процедуре SQL Server?

#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;