我有一些使用多个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。
有没有人有任何想法如何实现这一目标?谢谢!
答案 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”语句。这些关键字类似于大多数编程语言中的花括号,并允许在给定语句中指定多行。