2017-03-02 92 views
0

在此存储过程中,当@Id为5时,我想要使用Id的3和5获取记录。我该如何实现?存储过程中字段的多值

CREATE PROCEDURE spEmployee 
    @EmployeeName NVarchar(100), 
    @Id int, 
AS 
    SET NOCOUNT ON 

    SELECT * 
    FROM tblEmployees 
    WHERE EmployeeName = CASE 
          WHEN @EmployeeName IS NOT NULL 
           THEN @EmployeeName 
           ELSE EmployeeName 
         END 
     AND Department = CASE 
          WHEN @Id IS NOT NULL 
          THEN @Id 
          ELSE Id 
         END 
GO 

回答

0

事情是这样的:

select * 
from tblEmployees 
where (EmployeeName = @EmployeeName or @EmployeeName is null) and 
     (@id is null or 
     @id = 5 and Department = 3 or 
     Department = @id 
    ); 

一般来说,where子句中使用case语句使代码有点难以理解(它只是另一种除了布尔运算符) 。

两个很好的理由使用在where一个case是:

  • 因为在select一列使用相同的逻辑。
  • 因为您需要顺序评估以防止某种错误或确保很少执行昂贵的功能。

否则,最好坚持andor

+0

为什么我将代码更改为'@id = 5和Id = 3和Id = 2',它使我只是id = 5 –

+0

@E_N_Y。 。 。我不知道'id = 2'来自哪里。也许你的意思是'@id = 5和部门在(2,3)'中。 –