2013-05-04 2 views
0

id이 특정 세트에있는 레코드 목록을 가져 오려고합니다. 웹 서비스를 통해 다른 응용 프로그램에서이 집합을 가져옵니다. 다음과 같은 쿼리를 작성해야합니다 : SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?). 하지만 문제는 (?, ?, ?, ?) 부분이 가변 길이입니다. 한 요청에 대해서는 다음과 같습니다 : SELECT * FROM tbl_data WHERE id IN (?, ?, ?) 그리고 또 다른 요청은 SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?, ?, ?)입니다. 나는 정말로 하나씩 루프를 만들고 레코드를 얻는 것을 좋아하지 않는다. 이 쿼리를 작성할 수있는 방법이 있습니까?가변 조건의 데이터베이스에서 레코드 받기

+0

SELECT * FROM tbl_data WHERE id = yourID? –

+0

순수 JDBC를 사용하고 있습니까? 어떤 형태로 ID가 있습니까? –

+0

SO, http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause에서 가장 인기있는 질문을 복제 해 주셔서 감사합니다. 중복 생성을 계속하십시오. 프로그래머는 재사용하지 않아야합니다. 지속 가능성을 위해 재사용 및 재활용을 줄여야합니다. – Val

답변

3

당신은 당신의 코드에서 쿼리의 IN 일부를 생성 할 수 있습니다. ? symbol 대신에 무엇이 있어야하는지 알고 있다면 루프를 실행하여 빌드하십시오.

2

대신 "?, ?, ? ... , ?" 문자열을 반복하고 구성 할 수 있습니다. DB에 질문해야하는 ID만큼의 물음표를 넣으십시오. 다음은 문자열

에게 몇 가지 예제 코드를 구성하는 StringBuilder를 사용

@Test 
public void genSqlInParameterString() { 
    String select = "SELECT * FROM my_table WHERE "; 
    System.out.println(select + genSqlInParameterString(null)); 
    System.out.println(select + genSqlInParameterString(new String[]{})); 
    System.out.println(select + genSqlInParameterString(new String[]{"A"})); 
    System.out.println(select + genSqlInParameterString(new String[]{"A", "B"})); 
} 


public String genSqlInParameterString(String[] args) { 
    StringBuilder sb = new StringBuilder(); 
    if(args != null && args.length > 0) { 
     sb.append("IN ("); 
     for(int i = 0; i < args.length ; i++) { 
      sb.append('\'').append(args[i]).append('\''); 
      if(i < args.length-1) { 
       sb.append(", "); 
      } 
     } 
     sb.append(")"); 
    } 
    if(sb.length() == 0) { 
     // condition evaluates to false, so that select returns nothing 
     // you may instead return 1=1 so that all records are returned 
     // handling no-paramters case depends on your requirements 
     sb.append("1=0"); 
    } 
    return sb.toString(); 
} 

출력

SELECT * FROM my_table WHERE 1=0 
SELECT * FROM my_table WHERE 1=0 
SELECT * FROM my_table WHERE IN ('A') 
SELECT * FROM my_table WHERE IN ('A', 'B') 
+0

굉장합니다. 고맙습니다. –

+0

@MajidAzimi 환영합니다! – A4L

2

SQL 코드를 수동으로 작성하는 대신 QueryDSL 또는 JOOQ를 사용하십시오.

관련 문제