2016-09-29 22 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 *从数据库中,而是更明确一些,你需要的字段。这样可以防止删除您依赖的字段的模式更改(选择将失败,而不是稍后的某些代码),或者引入太多数据并仅使用一些代码。

相关问题