CASE ... ELSE *在Oracle SQL中忽略*

问题描述 投票:0回答:5

我正在尝试在SELECT语句中使用CASE,它将更改列中可能的12的两个值。

CASE WHEN grade = 0 THEN 'R2'
WHEN grade = -1 THEN 'R1'
ELSE --ignore--
END AS "Grade level"

有没有人知道如何替换--ignore--,以便只改变那两个可能的值?我真的不想继续为列中的每个值写出单独的WHEN。

sql oracle
5个回答
4
投票

由于成绩是一个数字,你需要将它转换为一个字符,以便它适合R1R2

CASE WHEN grade = 0 THEN 'R2'
WHEN grade = -1 THEN 'R1'
ELSE to_char(grade)
END AS "Grade level"

1
投票

取决于您的完整查询可能您可以将忽略条件的反向逻辑带到where子句:

CASE WHEN grade = 0 THEN 'R2'
WHEN grade = -1 THEN 'R1'
ELSE -- 1 or any value you can put here it dose not come in result becase of where clause
END AS "Grade level"
.....
where grade in (0,-1)

编辑:如果你能够在where子句中使用,你可以使上面的查询更简单(减少一个when):

...
CASE WHEN grade = 0 THEN 'R2'
     ELSE 'R1'
END AS "Grade level"
.....
where grade in (0,-1)

1
投票

也许你想要这个?

(CASE WHEN grade = 0 THEN 'R2'
      WHEN grade = -1 THEN 'R1'
      ELSE grade
 END) AS "Grade level"

我犹豫建议这个,因为grade似乎是一个数字量,但case语句正在评估一个字符串。但是,它似乎接近你想要的。

编辑:

正如所料,你需要转换一些东西。我会建议:

(CASE WHEN grade = 0 THEN 'R2'
      WHEN grade = -1 THEN 'R1'
      ELSE cast(grade as varchar2(255))
 END) AS "Grade level"

但是,如果要将grade设置为该值,则只会出现另一个转换错误,因为您无法将'R2'分配给数字。


1
投票

只需删除ELSE部分:

CASE WHEN grade = 0 THEN 'R2'
WHEN grade = -1 THEN 'R1'
END AS "Grade level"

0
投票

你可以把整个东西作为一个子查询放在你的FROM子句中,然后引用你在其下面一个单独的WHERE子句中命名的列...

SELECT * 
FROM
    (SELECT.....
    CASE WHEN grade = 0 THEN 'R2'
    WHEN grade = -1 THEN 'R1'
    ELSE NULL
    END AS "Grade level" 
    FROM .....
    WHERE.....)

WHERE "Grade level" is not null
;
© www.soinside.com 2019 - 2024. All rights reserved.