2014-09-10 154 views
1

我环顾四周,无法找到答案。据我所知,我正确使用这一点,但我很明显错过了一些东西,因为它不断返回与'关键字'CASE'附近的语法不正确'SQL CASE语句为if

我想取两个值,取决于'单词'它们返回的值是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 

这是哪里出错了?

+1

这看起来像T-SQL,因此我在标记它。 – 2014-09-10 13:16:38

回答

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 
@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(来自其他语言)混淆在一起,你将在其中执行不同的代码。他们看起来很相似,所以这是可以理解的。尽管如此,他们的行为却不同。据the documentation(重点煤矿):

CASE

评价了条件列表并返回多个可能的结果表达式之一

也就是说,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
+1

+1思维未来 – 2014-09-10 13:24:06

+1

谢谢 - 最后使用临时表 – Tom 2014-09-10 13:52:02

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 /当在选择/更新使用/删除查询,和IF/ELSE的流量使用。希望这是有道理

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

+0

精美的作品!非常感谢这个 – Tom 2014-09-10 13:17:42

1

这是一个很长的一个评论。

case是典型地与selectupdatedelete,或者set启动一个SQL语句内的表达式。它是而不是脚本语言中的控制流逻辑,它被称为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);