我环顾四周,无法找到答案。据我所知,我正确地使用了这个,但我显然错过了一些东西,因为它不断回来'关键字'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
哪里出错了?!
答案 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语句中的表达式,通常以select
,update
,delete
或set
开头。脚本语言中的不是控制流逻辑,称为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 case
与switch
(来自其他语言)混淆,您可以在其中执行不同的代码。它们看起来很相似,所以这是可以理解的。但他们的行为却不一样。根据{{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。希望这是有道理的