我想根據列進行比較。比方說,如果列> 5。Oracle - select * where column> 5
select * where column>5
該列包含非數字。我認爲Oracle允許我們比較字符串(比如Java)。
顯然這是不允許的。
ORA-01722: invalid number
01722. 00000 - "invalid number"
有沒有辦法與非數字字段進行比較?
感謝
我想根據列進行比較。比方說,如果列> 5。Oracle - select * where column> 5
select * where column>5
該列包含非數字。我認爲Oracle允許我們比較字符串(比如Java)。
顯然這是不允許的。
ORA-01722: invalid number
01722. 00000 - "invalid number"
有沒有辦法與非數字字段進行比較?
感謝
是的,你必須把5報價:
select * from table where column > '5'
可以使用to_char
功能
select * from table where column > to_char(5)
如果列varchar2
,則這樣的:
select * from some_table where some_column > 5
...將所有列值隱式轉換爲數字,所以你真的在做:
select * from some_table where to_number(some_column) > 5
這是造成的ORA-01722的to_number()
,即使你看不到它,當它擊中的值不是數字。在列值上調用的函數也會停止正在使用的任何索引(過度簡化了一點)。
你可以阻止它失敗,讓它使用索引,如果有的話,通過where some_column > '5'
像其他人說的那樣,或者where some_column > to_char(5)
。但是你需要小心地做比較,因爲它仍然是一個字符串比較,而不是數字;所以'10'
將不是被視爲> '5'
;並且您的NLS排序參數可能會產生您不期待的結果。或者更重要的是,其他人的NLS參數 - 例如,當你把這個活着的時候 - 可能會產生你不期望的產品結果,以及哪些產品結果與你在環境中得到的結果不相符。 See the documentation for more。
您應該使用number
列來保存數值,date
列用於保存日期等,varchar2
僅用於保存文本值。
要說明爲什麼它不起作用更多一點。
當使用數字字面值5
而不是字符字面值'5'
Oracle執行隱式數據類型轉換並嘗試將表中的所有值轉換爲數字。這就是你得到這個錯誤的原因。
你應該從來沒有依靠隱式數據類型轉換。這肯定會在某個時候給你帶來麻煩。
現在,如果您正確比較字符文字('5'
)與字符列,則不需要進行數據類型轉換,也不會出現錯誤。
但是:如果您希望Oracle實際進行數值比較,那麼您就錯了。字符串基於ASCII值。因此,(字符)值'10'
是低於比(字符)值'2
',因爲第一個字符'1'
排名低於'2'
。
請記住,當比較字符串「5」>「40」時是真的*。這就是爲什麼將數字數據存儲爲字符串通常是個壞主意。 – APC 2012-07-31 14:23:41