我正在尝试在CASE
子句中创建一个具有WHERE
函数的存储过程。
我有三个表:Bank
,Employee
和Level
。
我有一个参数@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
那么,我怎样才能得到我想要的结果呢?或者可能有更好的语法?
答案 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
)