2016-09-29 5 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

String을 숫자로 변환 할 수 있는지 묻는 중입니까? 파싱 ​​해봐. –

+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로 변환해야합니다. 실패하면 변환/읽기를 날짜로 시도합니다. 실패, ..... 그래서 당신이 마침내 가능한 데이터 유형을 마칠 때까지 계속 성공할 수 있습니다. – 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 메서드는 문자열을 정수로 변환하거나 그렇지 않으면 예외를 throw합니다. Long 또는 Double 등가의 동등한 버전이 있습니다.

그러나 예제 accountnumbers를 보면, 실제로 정수가 아니고보다 복잡한 구조를 가지고 있습니다. 두 필드 (primaryAccountNumber, theOtherAccountNumber) 등이있는 클래스로 모델링하고 파싱을 처리해야합니다. 다른 주에


, 당신은 데이터베이스에서 select * 안 것이 아니라 당신이 필요로하는 필드에 대한 명시. 이렇게하면 종속 된 필드를 제거하는 스키마 변경을 방지 할 수 있습니다.이 코드는 나중에 코드의 일부가 아니라 선택이 실패하거나 너무 많은 데이터를 가져 와서 그 중 일부만 사용하여 보호합니다.

관련 문제