CASE语句将数字转换为字符,而ELSE语句则在Oracle SQL中保留原始数字

CASE语句将数字转换为字符,而ELSE语句则在Oracle SQL中保留原始数字,sql,oracle,case,Sql,Oracle,Case,我试图创建一个简单的查询,将当前包含值0、1、2、3、4、5的评分/评估列转换为糟糕、差、差、一般和好。但正如您所看到的,只有5个标签值,但有6个数字值 因此,数字5需要显示为5,而所有其他数字将变成各自的标签(糟糕、差等) 我目前的查询如下: 选择课程id, 学生证, 案例评估 当0时,则为“可怕” 当我说“坏” 当2时,则为“平庸” 当3时,则“公平” 当4时,则“好” 结束 从预订您需要一个ELSE选项来处理不匹配的情况。使用TO_CHAR获取相同数据类型的所有值 SELECT eve

我试图创建一个简单的查询,将当前包含值0、1、2、3、4、5的评分/评估列转换为糟糕、差、差、一般和好。但正如您所看到的,只有5个标签值,但有6个数字值

因此,数字5需要显示为5,而所有其他数字将变成各自的标签(糟糕、差等)

我目前的查询如下:

选择课程id,
学生证,
案例评估
当0时,则为“可怕”
当我说“坏”
当2时,则为“平庸”
当3时,则“公平”
当4时,则“好”
结束

从预订
您需要一个
ELSE
选项来处理不匹配的情况。使用
TO_CHAR
获取相同数据类型的所有值

SELECT  event_id,
        trainee_id,
        CASE eval
            WHEN 0 THEN 'Terrible'
            WHEN 1 THEN 'Bad'
            WHEN 2 THEN 'Mediocre'
            WHEN 3 THEN 'Fair'
            WHEN 4 THEN 'Good'
            ELSE TO_CHAR(eval)
        END
FROM booking;

您需要一个
ELSE
选项来处理不匹配的情况。使用
TO_CHAR
获取相同数据类型的所有值

SELECT  event_id,
        trainee_id,
        CASE eval
            WHEN 0 THEN 'Terrible'
            WHEN 1 THEN 'Bad'
            WHEN 2 THEN 'Mediocre'
            WHEN 3 THEN 'Fair'
            WHEN 4 THEN 'Good'
            ELSE TO_CHAR(eval)
        END
FROM booking;

只需使用
'5'

SELECT  event_id,
        trainee_id,
        (CASE eval
            WHEN 0 THEN 'Terrible'
            WHEN 1 THEN 'Bad'
            WHEN 2 THEN 'Mediocre'
            WHEN 3 THEN 'Fair'
            WHEN 4 THEN 'Good'
            WHEN 5 THEN '5'
         END
        )
FROM booking;
或者,您可以使用带有默认值的显式
cast()
,使用
else

SELECT  event_id,
        trainee_id,
        (CASE eval
            WHEN 0 THEN 'Terrible'
            WHEN 1 THEN 'Bad'
            WHEN 2 THEN 'Mediocre'
            WHEN 3 THEN 'Fair'
            WHEN 4 THEN 'Good'
            ELSE cast(eval as varchar2(255))
         END
        )
FROM booking;

我鼓励您使用显式强制转换。SQL在执行隐式强制转换时容易出现难以调试的错误。

只需使用
'5'

SELECT  event_id,
        trainee_id,
        (CASE eval
            WHEN 0 THEN 'Terrible'
            WHEN 1 THEN 'Bad'
            WHEN 2 THEN 'Mediocre'
            WHEN 3 THEN 'Fair'
            WHEN 4 THEN 'Good'
            WHEN 5 THEN '5'
         END
        )
FROM booking;
或者,您可以使用带有默认值的显式
cast()
,使用
else

SELECT  event_id,
        trainee_id,
        (CASE eval
            WHEN 0 THEN 'Terrible'
            WHEN 1 THEN 'Bad'
            WHEN 2 THEN 'Mediocre'
            WHEN 3 THEN 'Fair'
            WHEN 4 THEN 'Good'
            ELSE cast(eval as varchar2(255))
         END
        )
FROM booking;

我鼓励您使用显式强制转换。SQL在执行隐式强制转换时容易出现难以调试的错误。

如果您不介意查询特定于Oracle,也可以使用
DECODE()
函数:

SELECT course_id, student_id
     , DECODE( eval, 0, 'Terrible', 1, 'Bad', 2, 'Mediocre', 3, 'Fair', 4, 'Good', TO_CHAR(eval) )
  FROM booking;
通过
案例
在该实例中节省了一点键入时间,并且更易于格式化

第三种选择是将评估分数及其描述存储在单独的表中,然后连接(使用外部连接)以获得描述:

SELECT b.course_id, b.student_id, COALESCE(es.eval_desc, TO_CHAR(b.eval))
  FROM booking b, eval_scores es
 WHERE b.eval = es.eval(+)

如果您不介意查询特定于Oracle,也可以使用
DECODE()
函数:

SELECT course_id, student_id
     , DECODE( eval, 0, 'Terrible', 1, 'Bad', 2, 'Mediocre', 3, 'Fair', 4, 'Good', TO_CHAR(eval) )
  FROM booking;
通过
案例
在该实例中节省了一点键入时间,并且更易于格式化

第三种选择是将评估分数及其描述存储在单独的表中,然后连接(使用外部连接)以获得描述:

SELECT b.course_id, b.student_id, COALESCE(es.eval_desc, TO_CHAR(b.eval))
  FROM booking b, eval_scores es
 WHERE b.eval = es.eval(+)

甲骨文!=MySQL,我修复了你的标签。这是一个case表达式,不是case语句……Oracle!=MySQL,我修复了你的标签。这是一个case表达式,不是case语句……除非我需要这样做,否则可能会有更多的实例使用0-4以外的数字。所以,如果有一个6,7,8,9等等,我不想在查询中写出每一个数字。@Tootally。然后使用第二个查询。@GordonLinoff,我相信在Oracle SQL
CASE
语句中使用的是
ELSE
而不是
DEFAULT
。@davidaber。这是因为这是标准,也是其他数据库所做的。我不知道我在想什么,或者至少不知道为什么我的手指在打字。这会起作用,除非我需要这样做,因为可能会有更多的情况下使用0-4以外的数字。所以,如果有一个6,7,8,9等等,我不想在查询中写出每一个数字。@Tootally。然后使用第二个查询。@GordonLinoff,我相信在Oracle SQL
CASE
语句中使用的是
ELSE
而不是
DEFAULT
。@davidaber。这是因为这是标准,也是其他数据库所做的。我不知道我在想什么,或者至少不知道为什么我的手指在打字。这仍然给了我“不一致的数据类型:预期的字符得到了数字”错误。
TO_CHAR()
应该返回
VARCHAR2
,而不是
NUMBER
。我不知道它是如何导致该错误的。这仍然会给我带来“不一致的数据类型:预期的CHAR-get-NUMBER”错误。
TO_-CHAR()
应该返回
VARCHAR2
,而不是
NUMBER
。我不明白这怎么会导致那个错误。