此IF
语句能否转换为CASE
语句?如果是,如何?如果没有,为什么不呢?CASE
语句只能返回1个值,这是SQL Server本身的限制吗?
感谢
IF @CategoryName = 'A'
Begin
Set @period1 = 'AA18'
Set @period2 = '1493'
End
Else If @CategoryName = 'B'
Begin
Set @period1 = 'AA22'
Set @period2 = '1563'
End
Else If @CategoryName = 'C'
Begin
Set @period1 = 'AB56'
Set @period2 = '2658'
End
Else
Begin
Set @period1 = 'BA03'
Set @period2 = '3552'
End
正如我在评论中提到的,SQL Server不支持Case
(Switch
(语句,只支持CASE
表达式。这些语句与Switch
语句(属于逻辑流操作(不同,顾名思义,它们是一个表达式。作为一个表达式的结果,它们返回一个标量值,就像任何其他表达式一样。
因此,您可以将上述表达式转换为CASE
表达式,但是,您需要2;每个变量一个。这看起来像这样:
SELECT @period1 = CASE @CategoryName WHEN 'A' THEN 'AA18'
WHEN 'B' THEN 'AA22'
WHEN 'C' THEN 'AB56'
ELSE 'BA03'
END,
@period2 = CASE @CategoryName WHEN 'A' THEN '1493'
WHEN 'B' THEN '1563'
WHEN 'C' THEN '2658'
ELSE '3552'
END;
您可以在不重复任何条件的情况下执行此操作,方法是使用VALUES
子句,并左联接到未绑定的SELECT
VALUES
仅用于ELSE
,否则您可以直接从第二部分中选择。
SELECT
@period1 = ISNULL(v2.Period1, v1.Period1)
@period2 = ISNULL(v2.Period2, v1.Period2)
FROM (VALUES ('BA03', '3552') v1(Period1, Period2)
OUTER APPLY (
SELECT 'AA18', '1493'
WHERE @CategoryName = 'A'
UNION ALL
SELECT 'AA18', '1493'
WHERE @CategoryName = 'B'
UNION ALL
SELECT 'AA18', '1493'
WHERE @CategoryName = 'C'
) v2(Period1, Period2)