2016-09-29 2 views
0

何日も失敗して検索したところ、私は尋ねると思った。取得した値の型をJavaでどのように決定するのですか?

カラムがすべてvarcharであるテーブルから値を取得しています。どのようにして価値の種類を特定するか。例えば、

ACCOUNTNUMBERは123456: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. 
     } 
    } 
    ... 

任意のポインタがはるかに高く評価され、123456ような値を有することができます。

+3

文字列を数値に変換できるかどうか尋ねていますか?それを解析してみてください。 –

+0

@PeterLawrey - 'parse'は行く方法と思われます。私はそれを完全に忘れてしまった。 – Bala

+1

Note Integer.parseInt(String0はi​​nt値のみを解析します。より大きい整数の場合はLong.parseLong(String)またはBigInteger.valueOf(String)が必要です。 –

答えて

1

ResultSet#getMetaData();は、必要な情報を提供します。 ResultMetaDataには、たとえば次のようないくつかの方法があります。 getColumnType(int)またはgetColumnClassName(int)

+0

すべての列がvarcharであるため、これは機能しません。日付値、数値はすべてvarcharに格納されています。 – Bala

+0

@Bala次に大きな問題があります。手動で値をIntegerに変換しようとします。失敗した場合は変換します。 – 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

nice試してみてください。浮動小数点の場合はどうしますか? :) – Antoniossss

+0

thtはこの質問から得ることができます:http://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers –

+0

私はあなたが私のポイントを逃したと思う:) – Antoniossss

1

これは意図した通りです。カラムはスキーマ内でvarcharとしてタイプされているため、データベースとJava SQLインタフェースでは、実際に数字や名前、日付などが格納されているかどうかを知ることができません。 getStringのみ有効です。

ストリングの結果を意味のある方法で解析することはあなた次第です。

たとえば、Integer.parseIntメソッドは文字列を整数に変換し、そうでない場合は例外をスローします。 LongまたはDoubleなどの同等のバージョンがあります。

しかし、例accountnumbersを見ると、それらは実際には整数ではなく、より複雑な構造になっています。 2つのフィールド(primaryAccountNumber、theOtherAccountNumberなど)を持つクラスを使ってモデル化したい場合は、解析する必要があります。別のノートで


、あなたは、データベースからselect *んではなく、あなたが必要とする分野について明示的です。これにより、依存していたフィールドを削除するスキーマの変更が防止されます(選択したコードが後で行番号の代わりに失敗する)か、あまりにも多くのデータを取得してその一部を使用するだけです。

関連する問題