在 CASE 语句中使用两个 = 符号?

Using two = signs in CASE statement?

我正在尝试使用依赖于变量的 case 语句来确定我的 WHERE 子句的一部分,但它不喜欢我正在做的事情。这是我的查询(为简单起见进行了修改)

DECLARE @SalesType VARCHAR(10)

SET @SalesType = 'Bulk'

SELECT CASE 
        WHEN fwsf.Customer_Cardlock_Customer = 'True'
            THEN 'CFN'
        ELSE 'Bulk'
        END AS 'Prod Type'
FROM TABLE t
WHERE CASE 
        WHEN @SalesType = 'Bulk' then t.customer_type = 'False'
        WHEN @SalesType = 'CFN' then t.customer_type = 'True'
        End

换句话说,我想在 WHERE 子句中声明,当 @SalesType 是给定值时,select 具有另一个值的行。

编辑:为了其他人,我意识到我有另一种情况,我可能需要 select 一个 'All' 选项。下面的 Per Shawn,他用我验证过的以下内容更正了我最初提出的解决方案:

AND t.customer_type =
CASE @SalesType
    WHEN 'Bulk' then 'False'
    WHEN 'CFN'  then 'True'
    WHEN 'All'  then t.customer_type
END
        END

您可以将 WHERE 子句写得更简单一些:

where 
  (@SalesType = 'Bulk' and t.customer_type = 'False')
   OR
  (@SalesType = 'CFN' and t.customer_type = 'True')
   OR 
   @SalesType = 'All'

CASE 表达式 只能 return 一个值而不是条件。所以只需将要比较的列移到case表达式之外,然后使用case表达式生成要比较的值即可。

DECLARE @SalesType VARCHAR(10);

SET @SalesType = 'Bulk';

SELECT CASE 
    WHEN fwsf.Customer_Cardlock_Customer = 'True' THEN 'CFN'
    ELSE 'Bulk'
    END AS 'Prod Type'
FROM TABLE t
WHERE t.customer_type = CASE 
    WHEN @SalesType = 'Bulk' THEN 'False'
    WHEN @SalesType = 'CFN' THEN 'True'
    END;

您的总结非常好,这是翻译解码值的常用方法。根据您的编辑,在某些情况下您还需要 all 个结果。

WHERE t.customer_type =
    CASE @SalesType
        WHEN 'Bulk' then 'False'
        WHEN 'CFN'  then 'True'
        WHEN 'All'  then t.customer_type
    END

我修改了表达式以使用不同形式的 case。您可能会发现它更具可读性,至少现在您知道它存在。

我还会注意到,在您原来的逻辑中,如果 case 落空,那么结果将为空。

"all rows" 可以通过返回 customer_type 值来处理,它自然总是等于它自己,除非是 null。要处理 null,您需要在等式的两边做一些更复杂的事情,例如 coalesce(t.customer_type, 'ALL!')

如果优化是一个问题,您最好使用常规 and/or 逻辑。

(
    @SalesType = 'Bulk' AND t.customer_type = 'False' OR
    @SalesType = 'CFN'  AND t.customer_type = 'True'  OR
    @SalesType = 'All'
)

如果您希望在 WHERE 子句中使用 CASE,那么您可以这样做:

WHERE 1 = CASE 
           WHEN @SalesType = 'Bulk' AND t.customer_type = 'False' THEN 1
           WHEN @SalesType = 'CFN' AND t.customer_type = 'True'THEN 1
           ELSE 0
          END