SQL Server : if to Case conversion



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)

最新更新