2013-05-04 62 views
0

我試圖獲取它們的id在特定集合中的記錄列表。我將通過Web服務從另一個應用程序獲取此集。我應該寫這樣的查詢: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? – 2013-05-04 08:08:07

+0

您使用純JDBC嗎?你有什麼形式的身份證? – 2013-05-04 08:11:57

+0

感謝您在SO中複製最流行的問題,http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause。保持創建重複。程序員必須避免重用。爲了可持續發展,我們必須減少再利用和回收。 – Val 2013-05-04 08:14:34

回答

3

您可以生成代碼查詢IN一部分。如果你知道應該是什麼,而不是? symbol,你只需運行循環並構建它。

String sqlPart = "("; 
for (every symbol but last){ 
sqlPart += symbol; 
sqlPart += ","; 
} 
sqlPart += lastSymbol; 
sqlPart += ")"; 

String sql = "SELECT * FROM tbl_data WHERE id IN " + sqlPart; 
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

真棒。非常感謝你。 – 2013-05-04 08:35:12

+0

@MajidAzimi不客氣! – A4L 2013-05-04 08:36:34

2

使用QueryDSL或JOOQ而不是手動編寫SQL代碼。

相關問題