Поместить где условие условия в SQL на основе условий? - PullRequest
0 голосов
/ 13 марта 2019

У меня есть хранимая процедура с двумя параметрами, которая возвращает мне список сотрудников. Моя хранимая процедура работает нормально, но мне нужно указать критерии в предложении where на основе условий. Вот моя хранимая процедура:

create procedure sp_GetEmployees

   @BranchId int = 0,
   @DeptId int = 0

as

Begin

 if(@BranchId > 0 and @DeptId > 0)
  select * from Employees where BranchId = @BranchId and DeptId = @DeptId
 else if (@BranchId > 0 and @DeptId = 0)
  select * from Employees where BranchId = @BranchId
 else if (@BranchId > 0 and @DeptId = 0)
  select * from Employees where DeptId = @DeptId
 else
  select * from Employees

End

Это простой случай, но у меня есть более сложные сценарии, когда я передаю от 8 до 10 параметров, и создание условий для них будет большой головной болью. Мне нужно упростить это в одном утверждении выбора. Я попробовал следующее, но, конечно, это не правильно:

if(@BranchId > 0 or @DeptId > 0)
select * from Employees where
     case @BranchId when 0 then ''
     else BranchId = @BranchId 
     End
else
select * from Employees  

Как мне это упростить?

Ответы [ 4 ]

1 голос
/ 13 марта 2019

Я бы пошел с этим, добавив OPTION (RECOMPILE) к вашему запросу;это означает, что любые планы запросов в кэше не будут использоваться, так как они могут быть бесполезны для другого набора параметров (с учетом того, что это универсальный запрос):

CREATE PROCEDURE sp_GetEmployees @BranchId int = 0,
                                 @DeptId int = 0
AS
BEGIN

    SELECT *
    FROM Employees
    WHERE (BranchId = @BranchId
        OR @BranchId = 0)
      AND (DeptId = @DeptId
        OR @DeptId = 0)
    OPTION (RECOMPILE);

END;

Вы пытались использоватьCASE выражение как утверждение, что это не так.

1 голос
/ 13 марта 2019

Вы можете сделать что-то вроде этого:

WHERE (@Parameter1 = 0 OR Field1=@Parameter1)
AND (@Parameter2 = 0 OR Field2=@Parameter2)
AND ...
1 голос
/ 13 марта 2019

Вы можете упростить ваш запрос следующим образом.

SELECT * 
FROM   Employee 
WHERE  ( Branchid = @BranchId 
          OR @BranchId = 0 ) 
       AND ( Deptid = @DeptId 
              OR @DeptId = 0 ) 
0 голосов
/ 13 марта 2019

Вы можете объединить свой запрос с проверкой состояния следующим образом:

ALTER PROCEDURE [dbo].[Your stored procedure name]  
 @aaa  INT condition parameter,  
 @bbb INT condition parameter,  
 @ccc INT condition parameter,  
 @RecordCount INT OUTPUT   
AS   

Declare @aaa nvarchar(500)  
Declare @bbb nvarchar(500)  
Declare @ccc nvarchar(500)  
BEGIN  
 BEGIN TRY  

  SET @qry = N'SELECT <here your query> where  1=1  
     '  
  IF @aaa= 0  
  BEGIN  
   SET @aaa = ''  
  END  
  ELSE  
  BEGIN  
   SET @aaa = ' and p.userid = '+CONVERT(varchar(5),@aaa)+' '  
  END  

  IF @bbb= 0  
  BEGIN  
   SET @bbb = ''  
  END  
  ELSE  
  BEGIN  
   SET @bbb = ' and p.Senderid = '+CONVERT(varchar(10),@bbb)+' '  
  END  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...