我有一個Oracle表和一列(col1
)的類型爲varchar2(12 byte)
。它有一個排和col1
價值1234
我可以在Oracle中爲varchar2傳遞一個數字嗎?
當我說
select * from table where col1 = 1234
甲骨文表示無效號碼。這是爲什麼?爲什麼我不能通過一個數字,當它是varchar2
?
編輯:所有的反應都很好。謝謝。但是我不明白爲什麼1234
是一個有效的varchar2數據類型時不需要1234
。
我有一個Oracle表和一列(col1
)的類型爲varchar2(12 byte)
。它有一個排和col1
價值1234
我可以在Oracle中爲varchar2傳遞一個數字嗎?
當我說
select * from table where col1 = 1234
甲骨文表示無效號碼。這是爲什麼?爲什麼我不能通過一個數字,當它是varchar2
?
編輯:所有的反應都很好。謝謝。但是我不明白爲什麼1234
是一個有效的varchar2數據類型時不需要1234
。
問題是,您希望Oracle將1234隱式轉換爲字符類型。相反,Oracle隱式地將該列轉換爲數字。列中有一個非數字值,所以Oracle會引發錯誤。 Oracle documentation在解釋如何解決問題之前會對隱式轉換髮出警告。解釋您所看到的行爲的規則是:
將字符值與數字值進行比較時,Oracle會將字符數據轉換爲數字值。
哦,這是更好的轉換爲char而不是數字:
select *
from table
where col1 = to_char(1234)
當COL1看起來並不像一個數字,TO_NUMBER返回一個錯誤,停止查詢。
Oracle說無效號碼。這是爲什麼?爲什麼我在varchar2時無法傳遞數字?
由於您將其作爲數字進行比較,因此Oracle會將字符類型col1
隱式轉換爲數字。
此外,您認爲1234
是只有行正在提取。實際上,Oracle必須從表中提取所有行,然後根據where
子句進行過濾。現在在col1
中有一個字符值,它在遇到您的1234
行&之前就會被提取,因爲該字符無法轉換爲數字。
This fiddle顯示該行爲。由於abc
canot被轉換爲數字,你會得到錯誤信息
現在,如果只記錄表中是包含數字字符COL1,你會看到statement will work fine
謝謝。非常好的解釋 – Victor
謝謝。所以這個角色是1234,這個oracle會隱式地轉換成一個數字。 SO爲什麼自1234年以來的錯誤是一個有效的數字? – Victor
表中的東西不是數字。 Oracle將1234作爲一個數字。它試圖將列中的值轉換爲匹配。當它找到一個不是數字的值時,它會拋出錯誤。 – JAQFrost