如何在WHERE子句中创建具有CASE功能的存储过程?

时间:2016-02-19 02:20:59

标签: sql sql-server

我正在尝试在CASE子句中创建一个具有WHERE函数的存储过程。

我有三个表:BankEmployeeLevel

我有一个参数@BankName,当@BankName Like 'AB%'时,结果是适用于该银行的员工。

@BankName NOT LIKE 'AB%'时,结果显示所有为其他银行而不是银行AB工作的员工。

@BankName IS NULL时,它会显示所有结果。

我试过这个

CREATE PROCEDURE [dbo].[usp_EmpList]
    @BankNAME   VARCHAR(50) = NULL
AS
BEGIN
    SELECT 
        b.BankName,
        e.EmployeeName,
        l.LevelName
    FROM 
        Bank b 
    INNER JOIN 
        Employee e ON b.EmpID = e.EmpID
    INNER JOIN 
        Level l ON l.LvlID = e.LvlID
    WHERE
        b.BankName = CASE
                WHEN @BankName = 'AB' THEN 'AB'
                WHEN @BankName NOT LIKE 'AB%' THEN '' --This is where I'm confused.
                ELSE NULL
                 END
END

那么,我怎样才能得到我想要的结果呢?或者可能有更好的语法?

2 个答案:

答案 0 :(得分:4)

不使用CASE表达式,而是使用AND - OR条件的组合:

WHERE
    (@BankName IS NOT NULL AND @BankName LIKE 'AB%' AND b.BankName LIKE 'AB%')
    OR (@BankName IS NOT NULL AND @BankName NOT LIKE 'AB%' AND b.BankName NOT LIKE 'AB%')
    OR (@BankName IS NULL)

注意:

此类查询称为catch-all-query.有许多方法可以实现此目的。其中之一是以上。阅读文章了解更多信息。

答案 1 :(得分:0)

您可以使用简单的AND和OR子句替换CASE。这可能是什么样的

CREATE PROCEDURE [dbo].[usp_EmpList]
 @BankNAME  VARCHAR(50) = NULL
AS
BEGIN
    SELECT 
        b.BankName,
        e.EmployeeName,
        l.LevelName
    FROM 
        Bank b INNER JOIN Employee e ON b.EmpID = e.EmpID
        INNER JOIN Level l ON l.LvlID = e.LvlID
    WHERE
        (@BankName = 'AB' AND b.BankName = 'AB') OR 
        (@BankName NOT LIKE 'AB%' AND b.BankName = '') OR
        (
          NOT (@BankName = 'AB' AND @BankName NOT LIKE 'AB%') AND
          b.bankName IS NULL
        )