2012-08-06 4 views
0

레코드/데이터/문자열 길이가 8 문자보다 큰 테이블 필드에서 레코드를 가져와야합니다. 쿼리가 (MySQL, MSSQL, Oracle)에서 사용되어야하므로 어떤 문자열 함수도 사용할 수 없습니다.문자열 함수를 사용하지 않고 문자열 길이에 따라 데이터베이스에서 데이터를 가져 오는 방법

나는 아래의 예를 싶지 않아 : 다른

List<String> names = new ArrayList<String>(); 
String st = select 'name' from table; 

rs = executeSQL(st); 
if (rs != null) 
{ 
    rs.next(); 
    names.add(rs.getString(1)); 
} 

for(String name : names) 
{ 
    if(name.length() > 8) 
    result.add(name); 
} 

어떤 생각 다음 위의 코딩을? 검색된 데이터를 처리하는 대신 필요한 결과를 얻은 다음 필요한 결과를 얻을 수있는 쿼리입니다.

도움/단서를 가져 주셔서 감사합니다.

답변

1

JDBC 드라이버는 JDBC 사양의 부록 D (스칼라 함수)에 나열된 함수에 대해 JDBC 이스케이프를 구현할 수 있습니다. 드라이버는 지원하는 스칼라 함수를 데이터베이스 측의 적절한 함수로 변환해야합니다.

SELECT * FROM table WHERE {fn CHAR_LENGTH(field)} > 8 

당신은 LENGTHCHAR_LENGTH을 대체 할 수 있습니다 : 지원되는 기능의 목록이

당신이 다음 중 하나와 같은 CHAR_LENGTH(string) 또는 LENGTH(string)을 사용하는 쿼리에서이를 사용하려면 'DatabaseMetaData.getStringFunctions을()'를 사용하여 조회 할 수 있습니다 . 드라이버 (이 함수를 지원하는 경우)는 기본 데이터베이스의 해당 함수로 변환합니다. 섹션 13.4.1 스칼라 함수는 JDBC 4.1 사양의에서

:

부록 D "라 함수는"드라이버가 지원하기 위해 예상되는 스칼라 함수 의 목록을 제공하는 드라이버가 필요합니다. 그러나 데이터 소스가 지원하는 경우에만 이 함수를 구현하십시오.

부록 D "스칼라 함수"에 정의 된 스칼라 함수를 호출하는 데 스칼라 함수의 이스케이프 구문을 사용해야합니다. 이스케이프 구문은 사용자 정의 공급자 또는 공급 업체 특정 스칼라 함수를 호출하는 데 사용되지 않습니다.내가 찾은

+0

감사합니다. 나는이 스칼라 함수에 대해 몰랐다. –

+0

@SardarFaisal JDBC 탈출구는 많이 사용되지 않는다고 생각합니다. 그래서 널리 알려지지 않았습니다. –

1

나는 데이터베이스의 힘을 이용하고 SQL 문 (또는 SQL 기능을 캡슐화하는 객체 일 수도 있음)에 대해 factory을 구현하는 것이 더 나을 것이라고 생각합니다.

그런 식으로 데이터베이스의 이름/유형을 사용하여 팩토리를 구성 할 수 있으며, 해당 데이터베이스에 대해 적절한 SQL 문을 제공합니다. 이 기능은 데이터베이스의 기능을 활용하고 코드에서 차선의 방식으로 데이터베이스 기능을 복제 할 필요없이이 정보를 매개 변수화하는 깔끔한 방법을 제공합니다.

당신이 만드는하지 않는

DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE); 
    List<String> names = fac.getLongNames(); 

있도록 가정이 다시 :

DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE); 
    String statement = fac.getLongNames(); 
    // then use this statement. It'll be configured for each db type 

이 뭔가를 더 캡슐화하고 사용하는 것이 아마 현명하다. 공통 스키마 및 질의 방법 등을 포함 할 수 있습니다.

+0

예 Brian이 맞습니다. 그러나 여기서는 어떤 데이터베이스가 쿼리되는지 알지 못합니다. 난 그냥 데이터를 검색하고 반환하는 다른 구성 요소에 쿼리를 제공해야합니다. 네가 한 말을 이해한다면 내 시나리오에서는 불가능 해 보인다. 감사합니다 –

+0

찾은 또 다른 해결책은 다음과 같습니다. '________'과 같은 이름을 테이블에서 선택하십시오. –

0

또 다른 해결책은 다음과 같습니다

Select name from table where name like '________'; 

SQL 밑줄 (_) 문자를 계산하고 밑줄 문자의 수와 동일한 길이의 이름을 반환합니다.

관련 문제