我正在尝试在SELECT语句中使用CASE,它将更改列中可能的12的两个值。
CASE WHEN grade = 0 THEN 'R2'
WHEN grade = -1 THEN 'R1'
ELSE --ignore--
END AS "Grade level"
有没有人知道如何替换--ignore--,以便只改变那两个可能的值?我真的不想继续为列中的每个值写出单独的WHEN。
由于成绩是一个数字,你需要将它转换为一个字符,以便它适合R1
和R2
。
CASE WHEN grade = 0 THEN 'R2'
WHEN grade = -1 THEN 'R1'
ELSE to_char(grade)
END AS "Grade level"
取决于您的完整查询可能您可以将忽略条件的反向逻辑带到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)
也许你想要这个?
(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'
分配给数字。
只需删除ELSE
部分:
CASE WHEN grade = 0 THEN 'R2'
WHEN grade = -1 THEN 'R1'
END AS "Grade level"
你可以把整个东西作为一个子查询放在你的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
;