根据条件将where子句标准放在SQL中?

问题描述 投票:0回答:4

我有一个带有两个参数的存储过程,它返回给我的员工列表。我的存储过程工作正常,但我需要根据条件将条件放在我的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个参数,为他们制定条件将是一个很大的麻烦。我需要在一个select语句中简化它。我尝试了以下但当然,这是不正确的:

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

我该如何简化它?

sql-server stored-procedures condition where-clause
4个回答
1
投票

您可以像下面这样简化查询。

SELECT * 
FROM   Employee 
WHERE  ( Branchid = @BranchId 
          OR @BranchId = 0 ) 
       AND ( Deptid = @DeptId 
              OR @DeptId = 0 ) 

1
投票

我会这样做,将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
投票

你可以这样做:

WHERE (@Parameter1 = 0 OR Field1=@Parameter1)
AND (@Parameter2 = 0 OR Field2=@Parameter2)
AND ...

0
投票

您可以像这样连接查询和条件检查:

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  
© www.soinside.com 2019 - 2024. All rights reserved.