我試圖獲取它們的id
在特定集合中的記錄列表。我將通過Web服務從另一個應用程序獲取此集。我應該寫這樣的查詢:SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?)
。但問題是(?, ?, ?, ?)
部分是可變長度。對於一個請求,它是這樣的:SELECT * FROM tbl_data WHERE id IN (?, ?, ?)
,另一個請求是:SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?, ?, ?)
。我真的不喜歡循環並逐一獲取記錄。有什麼方法來建立這個查詢?從可變條件的數據庫獲取記錄
0
A
回答
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代碼。
相關問題
- 1. 根據條件從json獲取記錄
- 2. Angular 2 - 從數據庫中獲取最後5條記錄
- 3. ActiveRecord - 從數據庫中獲取第5到第10條記錄
- 4. 從數據庫中一次又一次獲取5條記錄
- 5. 從mysql數據庫中獲取幾百條記錄
- 6. 從SQLite數據庫中獲取10條隨機記錄
- 7. 使用C#從SQL Server數據庫獲取多條記錄
- 8. 使用條件從數據集中獲取記錄
- 9. SSIS - 根據條件獲取記錄
- 10. 從數據庫返回一條記錄
- 11. 不使用「IS NULL」條件從數據庫中獲取「NULL」記錄。?
- 12. 獲取記錄在MySQL數據庫
- 13. 從mongodb中的上一條記錄中獲取數據
- 14. 從表中的第15條記錄獲取數據直到最後一條從表中獲取數據
- 15. 如何從mysql數據庫中獲取一條記錄中的每個元素
- 16. 如何從Angular 2中的Firebase數據庫中獲取一條記錄
- 17. 如何從MYSQL數據庫的最後10條記錄中獲取最低ID?
- 18. 如何從特定條件的數據庫中獲取數據
- 19. Django從數據庫中獲得最後一條記錄
- 20. 從數據庫中取出一條記錄到選擇列表
- 21. 從行中的表中獲取數據庫中的記錄
- 22. 在Rails 4中根據date_of_birth從數據庫獲取記錄
- 23. 使用preg_replace變量獲取數據庫記錄
- 24. 從數據庫中獲取記錄時的動態rowspan
- 25. 當從數據庫獲取記錄時顯示空的tableview
- 26. CakePHP,從數據庫表中獲取記錄的編號
- 27. 從SQLite數據庫獲取最新記錄的問題表
- 28. 從10個表中獲取來自MySQL數據庫的記錄
- 29. 獲取與VB .NET從sqlserver的數據庫記錄
- 30. 從數據庫獲取一天的舊記錄
SELECT * FROM tbl_data WHERE id = yourID
? – 2013-05-04 08:08:07您使用純JDBC嗎?你有什麼形式的身份證? – 2013-05-04 08:11:57
感謝您在SO中複製最流行的問題,http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause。保持創建重複。程序員必須避免重用。爲了可持續發展,我們必須減少再利用和回收。 – Val 2013-05-04 08:14:34