Как объединить SQL-запрос в Java? - PullRequest
0 голосов
/ 31 января 2019

Я начинаю изучать SQL и Java, и у меня есть проблема.

Логика для кода:

Первая часть оператора sql должна быть "a.stdn_code_ts", и так как включено больше элементов (в данном случае кода студента), мне нужнообъединить с оператором OR-Statement.

Коды учеников могут быть одним значением или диапазоном, например, допустимо «567777» и «567777-876677».

Если оноэто одно значение, просто добавьте "=", затем код студента.В примере, если пользователь ввел «567777», запрос должен выглядеть примерно так: «a.stdnt_code_ts =« 567777 »

Если это диапазон, добавьте первый код ученика, а затем« МЕЖДУ »второй код.То есть: если пользователь ввел '567777-876677', запрос должен быть "a.stdnt_code_ts BETWEEN '567777' AND '876677'".

и, как я упоминал выше, если есть 2 или более кодов учениковзапрос должен быть объединен с «ИЛИ 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] + 
            "'";
        }
    }
}

1 Ответ

0 голосов
/ 31 января 2019

Во-первых, этот код неполон, поэтому мне нужно сделать некоторые предположения.Но давайте попробуем.

Давайте сначала исправим цикл:

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 ");
}

Теперь добавим фактические параметры для каждого вопросаmark:

PreparedStatement preStmt = conn.prepareStatement(sql);
int count = 0;

for (String code : arguments) {
    preStmt.setString(++count, code);
}

И, наконец, для выполнения запроса:

ResultSet rs = preStmt.executeQuery();

Обратите внимание, что я не запускаю этот код, поэтому я могу пропустить одну или две строки, но это общееИдея, как это должно быть сделано правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...