【问题标题】:SQL CASE statement for ifif 的 SQL CASE 语句
【发布时间】:2014-09-10 13:11:49
【问题描述】:

我环顾四周,找不到答案。据我所知,我正在正确使用它,但我显然遗漏了一些东西,因为它不断返回“关键字'CASE'附近的语法不正确”

我正在尝试获取两个值,并根据它们返回的“单词”返回 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

这是哪里出了问题?!

【问题讨论】:

  • 这看起来像T-SQL,所以我这样标记它。

标签: sql sql-server tsql case


【解决方案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

【讨论】:

  • 谢谢 - 最后使用了临时表
【解决方案2】:
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

【讨论】:

  • 效果很好!非常感谢这个
【解决方案3】:

这是一个很长的评论。

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);

【讨论】:

    【解决方案4】:

    你要么这样做:

    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 用于流程。希望这是有道理的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2016-08-22
      • 1970-01-01
      相关资源
      最近更新 更多