CASE 语句将 NUMBER 转换为 CHAR,但在 Oracle SQL 中保留原始 NUMBER 的 ELSE

CASE statement turning a NUMBER into a CHAR, but the ELSE to keep original NUMBER in Oracle SQL

我正在尝试创建一个简单的查询,将当前包含值 0、1、2、3、4、5 的 grading/evaluation 列转换为 Terrible、Poor、Bad、Mediocre 和 Good .但如您所见,只有 5 个标签值,但有 6 个数字值。

因此数字 5 需要显示为 5,而所有其他数字将变成它们各自的标签(Terrible、Poor 等)。

我目前的查询如下:

SELECT  course_id,
  student_id,
  CASE eval
  WHEN 0 THEN 'Terrible'
  WHEN 1 THEN 'Bad'
  WHEN 2 THEN 'Mediocre'
  WHEN 3 THEN 'Fair'
  WHEN 4 THEN 'Good'
  END
  FROM booking;

在下面的查询结果中,我知道 COURSE_ID 标记为 10121 的评估值为 5 所有其他的都是空的,所以它们是空白的。但是10121需要显示为5

如果我尝试将 ELSE 语句应用于 return 原始值(通过执行 inner select 语句),它会显示 ERROR at line 9: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER

 COURSE_ID STUDENT_ID CASEEVAL
---------- ---------- --------
     10111   10235000 Good
     10111   10285858 Fair
     10112   10288497
     10112   10092464 Fair
     10113   10235000
     10114   10128018 Terrible
     10114   10288497
     10115   10092464 Terrible
     10115   10128018 Bad
     10116   10128018
     10118   10288497 Bad
     10118   10836444 Fair
     10119   10285858
     10120   10412445 Mediocre
     10121   10836444
     10122   10285858 Good
     10123   10412445 Mediocre
     10125   10095146

您需要一个 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 进行隐式转换时容易出现难以调试的错误。

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

SELECT course_id, student_id
     , DECODE( eval, 0, 'Terrible', 1, 'Bad', 2, 'Mediocre', 3, 'Fair', 4, 'Good', TO_CHAR(eval) )
  FROM booking;

在这个实例中比 CASE 节省了一些输入,而且格式化也更容易一些。

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

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(+)