SQLServer-使用CASE语句
我有一个带有WHERE子句的SELECT语句,我想根据是否提供了参数动态更改该语句 我似乎不明白如何在WHERE子句中使用CASE语句,但我希望它看起来像使用IF语句一样SQLServer-使用CASE语句,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个带有WHERE子句的SELECT语句,我想根据是否提供了参数动态更改该语句 我似乎不明白如何在WHERE子句中使用CASE语句,但我希望它看起来像使用IF语句一样 DECLARE @Gender NVARCHAR(100) = NULL --this is an INPUT parameter and may or may not be NULL DECLARE @Status NVARCHAR(100) = NULL --this is an INPUT parameter and m
DECLARE @Gender NVARCHAR(100) = NULL --this is an INPUT parameter and may or may not be NULL
DECLARE @Status NVARCHAR(100) = NULL --this is an INPUT parameter and may or may not be NULL
SELECT Name
FROM Person
WHERE
-- first WHERE clause
IF @Gender IS NULL
BEGIN
Gender IS NULL
END
ELSE
BEGIN
Gender = @Gender
END
AND
-- second WHERE clause
IF @Status IS NULL
BEGIN
Status IS NULL
END
ELSE
BEGIN
Status LIKE '%' + @Status + '%'
END
是否可以将此代码转换为CASE
语句?您可以执行以下操作:
DECLARE @Gender NVARCHAR(100) = NULL --this is an INPUT parameter and may or may not be NULL
DECLARE @Status NVARCHAR(100) = NULL --this is an INPUT parameter and may or may not be NULL
SELECT Name
FROM Person
WHERE CASE WHEN @Gender IS NULL THEN 1
WHEN @Gender = ISNULL(Gender, '') THEN 1
ELSE 0
END = 1
AND CASE WHEN @Status IS NULL THEN 1
WHEN ISNULL(Status, '') LIKE '%' + @Status + '%' THEN 1
ELSE 0
END = 1
SELECT Name
FROM Person
WHERE Gender = COALESCE(@gender, Gender)
AND (@Status is null or Status like '%' + @status + '%')
我想你想要:
select p.name
from person p
where ( (@gender is null and gender is null) or gender = @gender) and
( (@status is null and status is null) or status = @status);
请注意,这会导致“空匹配”。通常,人们希望使用NULL
选择所有记录,而不仅仅是NULL
记录。如果这是您的意图,那么:
select p.name
from person p
where ( @gender is null or gender = @gender) and
( @status is null or status = @status);
在这两种情况下,
的where
中都不需要case
。作为一般规则,不要在where
中使用case
——除非您确实需要它来控制表达式的求值顺序。如果性别为空或状态为空,则您提供的解决方案链接的可能副本将不起作用。到目前为止,您已拒绝所有建议。。。但问题中没有任何东西可以用(样本数据)测试任何解决方案。。。您也没有提供测试用例(参数组合的预期结果)。不幸的是,如果性别为NULL或状态为NULL,则此选项不起作用。不幸的是,如果性别为NULL或状态为NULL,则此选项不起作用,因为一般规则有点像最佳实践,作为替代方案,我可以有两个不同的存储过程,在不同的位置进行选择吗?然后有一个主SP,它只调用两个选择SP中的任意一个,这取决于性别或状态是否为null?或者是使用一个SP调用另一个SP的错误做法?@thecodeexplorer不需要多个SP。您可以使用单个SP并使用如果
/则
逻辑来选择要执行的相应选择
语句。对于另一种方法,您可能(也可能不)想了解。