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(+)
我正在尝试创建一个简单的查询,将当前包含值 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(+)