2016-03-03 87 views
-1

尝试运行我的查询时,我不断收到此错误“ORA-01722:invalid number”。我已经重新编写了几次试图绕过错误的查询,但似乎无法做到这一点。必须将案例陈述抛出,以便按照GPA课程时间比较课程级别。当然有人对我的问题有一些提示或答案!在此先感谢Oracle SQL Developer“ORA-01722:invalid number”

select distinct 
    initcap(stride_last_name), 
    stride_first_name, 
    substr(stride_middle,1,1), 
    case 
     when nvl(sum(gpa_hours_earned),'0') between '0' and '29.9' then 'Freshmen'     
     when nvl(sum(gpa_hours_earned),'0') between '30' and '59.9' then 'Sophomore' 
     when nvl(sum(gpa_hours_earned),'0') between '60' and '89.9' then 'Junior' 
     when nvl(sum(gpa_hours_earned),'0') >= '90' then 'Senior' 
     else 'Freshmen' 
    end 

回答

0

假设你gpa_hours_earned列数字,这是因为你比较字符串的款项,这意味着字符串文字像'29.9'被隐式转换为数字,你的会话建立有逗号作为小数点分隔符和句点作为组分隔符。您可以更改会话NLS_NUMERIC_CHARACTERS设置,或使用指定小数点分隔符的显式转换。

但是,你不应该使用文字文字的数字。周围所有的人都删除引号:

select distinct 
    initcap(stride_last_name), 
    stride_first_name, 
    substr(stride_middle,1,1), 
    case 
     when nvl(sum(gpa_hours_earned),0) between 0 and 29.9 then 'Freshmen'     
     when nvl(sum(gpa_hours_earned),0) between 30 and 59.9 then 'Sophomore' 
     when nvl(sum(gpa_hours_earned),0) between 60 and 89.9 then 'Junior' 
     when nvl(sum(gpa_hours_earned),0) >= 90 then 'Senior' 
     else 'Freshmen' 
    end 

既然你实际查询必须有一批by语句,你不需要distinct。你可以简化案例,因为它使用短路评估:

case 
     when nvl(sum(gpa_hours_earned),0) < 30 then 'Freshmen'     
     when nvl(sum(gpa_hours_earned),0) < 60 then 'Sophomore' 
     when nvl(sum(gpa_hours_earned),0) < 90 then 'Junior' 
     else 'Senior' 
    end 
+0

感谢您的帮助,我很感激它!不幸的是,在收到你的建议之后,它仍然在向我抛出错误代码。我不确定这个世界正在造成什么!我删除了这个独特的,拿出了字符串文字,并按照你的建议重新格式化了case语句。有没有下一步你可能认为我可以试一试? – GMitchell

+0

'gpa_hours_earned'实际上是数字列还是字符串?如果它是一个字符串,它几乎肯定不会,并且可能包含无法转换的错误值。 –

+0

@GMitchell - 如果它是一个数字,你能编辑问题来显示整个(原始)查询,表格定义和完整的错误信息吗?错误可能来自您未显示的内容。 –