SQL CASE表达式 - 设置局部变量的值

时间:2013-10-10 16:30:43

标签: sql sql-server tsql sql-server-2000 case

我有一些使用多个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 Expression。例如

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。

有没有人有任何想法如何实现这一目标?谢谢!

2 个答案:

答案 0 :(得分:23)

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个单独的变量。作为基于集合的解决方案,您可以做更好的事情,从核心或临时表读取。但是我们需要更多关于你要做什么的细节(用一个小的但完全有效的例子)。

答案 1 :(得分:3)

作为Chris J答案的修正案。这里的任何人都希望在单个if中设置 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

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