9

我有一些使用多个 if 语句(大约 100 个)的 T-SQL 代码,如下所示。如果第一个 IF 语句条件评估为 TRUE,它仍会评估其余 99 个语句。

IF(@check = 'abc') SET @var1 = @value
IF(@check = 'def') SET @var2 = @value
IF(@check = 'ghi') SET @var3 = @value
IF(@check = 'jkl') SET @var4 = @value
IF(@check = 'mno') SET @var5 = @value
…
…

我想将这些转换为使用 CASE 表达式。例如

CASE @check
    WHEN 'abc' THEN SET @var1 = @value
    WHEN 'def' THEN SET @var2 = @value
    WHEN 'ghi' THEN SET @var3 = @value
    WHEN 'jkl' THEN SET @var4 = @value
    WHEN 'mno' THEN SET @var5 = @value
    …
    …
END

但是,我无法这样做,并且收到一条 SQL 错误,提示我无法在 CASE 表达式中使用 SET。

有谁知道我如何实现这一目标?谢谢!

4

2 回答 2

25

case 语句不会削减它:您可以将 SET 与 CASE 一起使用的唯一方法是:

SET @var = CASE @check
       WHEN 'abc' THEN @value
       [etc]
    END

...这对您不起作用,因为它只能设置一个变量。所以你需要使用ELSE,即:

IF (@check = 'abc') SET @var1 = @value
ELSE IF (@check = 'def') SET @var2 = @value
ELSE IF (@check = 'ghi') SET @var3 = @value
ELSE IF (@check = 'jkl') SET @var4 = @value
ELSE IF (@check = 'mno') SET @var5 = @value
   [...]

但是,如果您有 100 个像这样设置 100 个不同变量的子句,那么听起来您的方法可能是错误的:我会退后一步,问自己为什么需要 100 个单独的变量。作为基于集合的解决方案,您可以做一些更好的事情,无论是从核心表还是临时表中读取。但是,我们需要有关您尝试做的事情的更多详细信息(使用一个小但功能齐全的示例)。

于 2013-10-10T16:38:05.967 回答
3

作为对 Chris J 答案的修正。任何想要在单个 if、else if 或 else中设置MULTIPLE参数的人 - 使用以下语法:

IF (@check = 'abc') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
ELSE IF (@check = 'def') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
ELSE IF (@check = 'ghi') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
ELSE IF (@check = 'jkl') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end
 ELSE IF (@check = 'mno') 
   begin
       SET @var1 = @value
       SET @var2 = @value
   end

注意“开始”和“结束”语句的使用。这些关键字类似于大多数编程语言中的花括号,并允许在给定语句中指定多行。

于 2015-05-21T19:50:46.013 回答