CASE语句将数字转换为字符,而ELSE语句则在Oracle SQL中保留原始数字
我试图创建一个简单的查询,将当前包含值0、1、2、3、4、5的评分/评估列转换为糟糕、差、差、一般和好。但正如您所看到的,只有5个标签值,但有6个数字值 因此,数字5需要显示为5,而所有其他数字将变成各自的标签(糟糕、差等) 我目前的查询如下: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
选择课程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 SQLCASE
语句中使用的是ELSE
而不是DEFAULT
。@davidaber。这是因为这是标准,也是其他数据库所做的。我不知道我在想什么,或者至少不知道为什么我的手指在打字。这仍然给了我“不一致的数据类型:预期的字符得到了数字”错误。TO_CHAR()
应该返回VARCHAR2
,而不是NUMBER
。我不知道它是如何导致该错误的。这仍然会给我带来“不一致的数据类型:预期的CHAR-get-NUMBER”错误。TO_-CHAR()
应该返回VARCHAR2
,而不是NUMBER
。我不明白这怎么会导致那个错误。