SQLServer-使用CASE语句

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

我有一个带有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 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并使用
如果
/
逻辑来选择要执行的相应
选择
语句。对于另一种方法,您可能(也可能不)想了解。