2016-03-03 126 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 - 如果它是一個數字,你能編輯問題來顯示整個(原始)查詢,表格定義和完整的錯誤信息嗎?錯誤可能來自您未顯示的內容。 –