2016-09-29 60 views
0

經過幾天搜索失敗,我想我會問。如何確定Java中的檢索值類型?

我從表中檢索一個值,其列是所有varchar。我們如何去確定價值的類型。對於例如

ACCOUNTNUMBER可以具有這樣的值作爲123456123456:78910

... 
    try(ResultSet rs = stmt.executeQuery("select * from table")){ 
     if(rs.next()){ 
     //Cannot use anything other than 'getString' 
     String var = rs.getString("accountnumber");     
     //Determine if var is an Integer 
     System.out.println(var instanceof Integer) //returns false because 'var' is of type String. 
     } 
    } 
    ... 

任何指針被讚賞。

+3

你問是否可以將字符串轉換爲數字嗎?嘗試解析它。 –

+0

@PeterLawrey - 'parse'似乎是要走的路。我完全忘記了這一點。 – Bala

+1

注意:Integer.parseInt(String0只會解析int值,對於大整數可能需要Long.parseLong(String)或BigInteger.valueOf(String) –

回答

1

ResultSet#getMetaData();會給你所需的信息。 ResultMetaData有一些方法可以幫助例如。 getColumnType(int)getColumnClassName(int)

+0

這不起作用,因爲所有的列都是varchar。日期值,數字都存儲在varchar中 – Bala

+0

@Bala然後你有一個很大的問題,你將不得不手動,例如,嘗試將值轉換爲Integer,如果失敗,嘗試轉換/讀取日期,如果它失敗,.....等等,直到你終於用盡了可能的數據類型並且MAYBE,你將成功 – Antoniossss

+0

@Bala我最好的選擇是向數據庫設計師詢問如何「有效地猜測列類型」) – Antoniossss

0

您可以使用pattern matching來檢查其編號或字符串。

String var = rs.getString("accountnumber"); 
    Matcher ss1 = Pattern.compile("([0-9]*)").matcher(var); 
    if (ss1.matches()) { 
     // its a number 
    } else { 
     // its a string 
    } 
+0

不錯嘗試,但如果它將是一個浮點? :) – Antoniossss

+0

tht可以從這個問題得到:http://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers –

+0

我認爲你錯過了我的觀點:) – Antoniossss

1

這個東西按預期工作。這些列在模式中鍵入爲varchar,因此數據庫和Java SQL接口無法知道您是否實際上有數字或名稱或日期或內部存儲的任何內容。只有getString應該工作。

這取決於你試圖以合理的方式解析字符串結果。

例如,Integer.parseInt方法會將字符串轉換爲整數,如果不能則拋出異常。有相當於LongDouble等的版本。

然而,看看帳戶的例子,它們不是真正的整數,而是具有更復雜的結構。你可能想用一個帶有兩個字段(primaryAccountNumber,theOtherAccountNumber)等的類來建模,並且它應該處理分析。


在不同的音符,你永遠不應該select *從數據庫中,而是更明確一些,你需要的字段。這樣可以防止刪除您依賴的字段的模式更改(選擇將失敗,而不是稍後的某些代碼),或者引入太多數據並僅使用一些代碼。