if的SQL CASE语句

时间:2014-09-10 13:11:49

标签: sql sql-server tsql case

我环顾四周,无法找到答案。据我所知,我正确地使用了这个,但我显然错过了一些东西,因为它不断回来'关键字'CASE'附近的语法错误

我正在尝试使用两个值,并且根据什么'word'它们返回值1-5。然后将它们相乘以给我一个'评级'

DECLARE @PR int
DECLARE @IR int
DECLARE @R int
DECLARE @ProbabilityRating varchar(max)
DECLARE @ImpactRating varchar(max)

SET @ProbabilityRating = 'High'
SET @ImpactRating = 'Medium'

CASE @ProbabilityRating
    WHEN 'Very Low' THEN @PR = 1
    WHEN 'Low' THEN @PR = 2
    WHEN 'Medium' THEN @PR = 3
    WHEN 'High' THEN @PR = 4
    WHEN 'Very High' THEN @PR = 5
END

CASE @ImpactRating
    WHEN 'Very Low' THEN @IR = 1
    WHEN 'Low' THEN @IR = 2
    WHEN 'Medium' THEN @IR = 3
    WHEN 'High' THEN @IR = 4
    WHEN 'Very High' THEN @IR = 5
END

SET @R = @IR * @PR

哪里出错了?!

4 个答案:

答案 0 :(得分:1)

DECLARE @PR int
DECLARE @IR int
DECLARE @R int
DECLARE @ProbabilityRating varchar(max)
DECLARE @ImpactRating varchar(max)

SET @ProbabilityRating = 'High'
SET @ImpactRating = 'Medium'
set @PR=(CASE @ProbabilityRating
    WHEN 'Very Low' THEN  1
    WHEN 'Low' THEN   2
    WHEN 'Medium' THEN  3
    WHEN 'High' THEN  4
    WHEN 'Very High' THEN   5
END)
set @IR=(
CASE @ImpactRating
    WHEN 'Very Low' THEN  1
    WHEN 'Low' THEN  2
    WHEN 'Medium' THEN  3
    WHEN 'High' THEN  4
    WHEN 'Very High' THEN  5
END)

SET @R = @IR * @PR
print @r

您的查询应如下所示 参考:https://stackoverflow.com/a/14631123/2630817

答案 1 :(得分:1)

这是一个很长的评论。

case是SQL语句中的表达式,通常以selectupdatedeleteset开头。脚本语言中的不是控制流逻辑,称为T-SQL。 if是控制流,但在这种情况下您不需要if。只需使用:

SET @PR = (CASE @ProbabilityRating
             WHEN 'Very Low' THEN 1
             WHEN 'Low' THEN 2
             WHEN 'Medium' THEN 3
             WHEN 'High' THEN 4
             WHEN 'Very High' THEN 5
           END);

SET @IR = (CASE @ImpactRating
             WHEN 'Very Low' THEN 1
             WHEN 'Low' THEN 2
             WHEN 'Medium' THEN 3
             WHEN 'High' THEN 4
             WHEN 'Very High' THEN 5
           END);

答案 2 :(得分:1)

由于您重复使用case,因此将这些值放在表格中可能是有意义的(fiddle):

create table Ratings
(
   Value int
  ,Description varchar(20)
)

insert Ratings values
 (1,'Very Low')
,(2,'Low')
,(3,'Medium')
,(4,'High')
,(5,'Very High')

然后从select ...

中分配变量
select 
 @IR = r.Value
from Ratings as r
where r.[Description] = @ImpactRating

select 
 @PR = r.Value
from Ratings as r
where r.[Description] = @ProbabilityRating

或者,您可以创建一个临时表(fiddle):

select
 d.*
into #Ratings
from (values
 ('Very Low',1)
,('Low',2)
,('Medium',3)
,('High',4)
,('Very High',5)
) d([Description], Value)

select 
 @IR = r.Value
from #Ratings as r
where r.[Description] = @ImpactRating

select 
 @PR = r.Value
from #Ratings as r
where r.[Description] = @ProbabilityRating

至于您的语法问题,似乎您将sql caseswitch(来自其他语言)混淆,您可以在其中执行不同的代码。它们看起来很相似,所以这是可以理解的。但他们的行为却不一样。根据{{​​3}}(强调我的):

  

<强> CASE   

评估条件列表并返回多个可能的结果表达式

这就是说,案例陈述解析为一个值。只需将该值赋给变量,如下所示:

set @PR = case @ProbabilityRating
    when 'Very Low' then 1
    when 'Low' then 2
    when 'Medium' then 3
    when 'High' then 4
    when 'Very High' then 5
end

答案 3 :(得分:0)

你要么这样做:

SELECT CASE WHEN @ImpactRating = 'Very Low' THEN ... END AS @IR

或者

IF @ImpactRating = 'Very Low'
    BEGIN
        SET @IR = 1
    END
ELSE IF @Impactrating = 'Low'
... 

CASE / WHEN用于选择/更新/删除查询,并且在流中使用IF / ELSE。希望这是有道理的