在 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
我正在尝试使用依赖于变量的 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