我开始学习SQL和Java,我有一个问题。
代码的逻辑是:
sql语句的第一部分应该是“ a.stdn_code_ts”,并且由于包含了更多元素(在本例中为学生代码),我需要与and语句连接。
学生代码可以是单个值或范围,例如说:“567777”是有效的,以及“567777-876677”
如果是单个值,只需添加“ =”,然后添加学生代码。在如果用户输入“567777”,那么查询应该是这样的“a.stdnt_code_ts =‘567777’”
的例子如果是范围,请添加第一个学生代码,然后添加“ BETWEEN”第二个代码。即:如果用户输入“ 567777-876677”,则查询应为“ a.stdnt_code_ts BETWEEN'567777'和'876677'”。
并且如上所述,如果有2个或更多学生代码,则应将查询与“ OR a.stdnt_code_ts”连接起来,然后再次检查它是否为单个值或范围。
我已经有了这段代码,被卡住了:
private void formatStudentCode(Connection connection) throws Exception {
studentCode = "a.stdnt_code_ts ";
for(int i=0; i < stdntCode.size(); i++) {
if (stdntCode.get(i).indexOf("-")==-1) {
studentCode += "= '" + stdntCode.get(i) + "'";
}
else {
String [] range=stdntCode.get(i).split("-");
studentCode += "BETWEEN '" + range[0] + "' AND '" + range[1] +
"'";
}
}
}
答案 0 :(得分:0)
首先,此代码不完整,因此我需要做出一些猜测。但是,让我们尝试一下。
让我们先修复循环:
String sql = "SELECT * FROM students";
List<String> terms = new ArrayList<>();
List<String> arguments = new ArrayList<>();
// Don't need index here, for each loop is better
for (String code : codes) {
// No need for IndexOf
if (code.contains("-")) {
terms.add("stdnt_code_ts between ? and ?");
String[] split = code.split("-");
arguments.add(split[0]);
arguments.add(split[1]);
}
else {
// Don't concatenate SQL query parameters
terms.add("stdnt_code_ts = ?");
arguments.add(code);
}
}
现在放置我们的OR
:
if (terms.size() > 0) {
sql += " WHERE " + Strings.join(terms, " OR ");
}
现在为每个问号添加实际参数:
PreparedStatement preStmt = conn.prepareStatement(sql);
int count = 0;
for (String code : arguments) {
preStmt.setString(++count, code);
}
最后执行查询:
ResultSet rs = preStmt.executeQuery();
请注意,我没有运行此代码,因此我可能会错过一两行,但这是正确完成操作的基本思路。