2012-07-31 77 views
1

我想根據列進行比較。比方說,如果列> 5。Oracle - select * where column> 5

select * where column>5 

該列包含非數字。我認爲Oracle允許我們比較字符串(比如Java)。

顯然這是不允許的。

ORA-01722: invalid number 
01722. 00000 - "invalid number" 

有沒有辦法與非數字字段進行比較?
感謝

回答

5

是的,你必須把5報價:

select * from table where column > '5' 
+1

請記住,當比較字符串「5」>「40」時是真的*。這就是爲什麼將數字數據存儲爲字符串通常是個壞主意。 – APC 2012-07-31 14:23:41

0

你缺少表:

select * where FROM tablename column>5 

但這僅僅在進行列是一個數字。如果沒有,則不能使用>


比較字符串,可以使用LIKESTRCMP(),檢查它們HERE的例子。


正如@Gerrat說,你也可以使用><但類型雙方必須兼容(與文字數字或文字數字)。要了解更多信息,請查詢THIS

請注意,在文本比較中,它將單獨比較每個字符,因此'11'將是'2'的<。

+0

您可以在Oracle中使用字符串「>」進行比較。它符合你的期望。 – Gerrat 2012-07-31 13:46:48

+0

@Gerrat邪惡的,我試過SQL小提琴,並沒有工作。 – 2012-07-31 13:49:25

+0

@aF。,看到這裏:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements002.htm – Ollie 2012-07-31 13:58:26

1

可以使用to_char功能

select * from table where column > to_char(5) 
3

如果列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僅用於保存文本值。

3

要說明爲什麼它不起作用更多一點。

當使用數字字面值5而不是字符字面值'5' Oracle執行隱式數據類型轉換並嘗試將表中的所有值轉換爲數字。這就是你得到這個錯誤的原因。

你應該從來沒有依靠隱式數據類型轉換。這肯定會在某個時候給你帶來麻煩。

現在,如果您正確比較字符文字('5')與字符列,則不需要進行數據類型轉換,也不會出現錯誤。

但是:如果您希望Oracle實際進行數值比較,那麼您就錯了。字符串基於ASCII值。因此,(字符)值'10'低於比(字符)值'2',因爲第一個字符'1'排名低於'2'