У меня есть веб-приложение, где от пользователя берут 3 входа и после нажатия кнопки поиска отображаются результаты. Три входа: идентификатор (не уникальный), начальная дата и конечная дата. Я хочу получить результаты в следующих ситуациях: если пользователь вводит
- только id
- только дата начала (регистрация в таблице БД)
- только дата окончания (дата окончания в таблице БД)
- идентификатор и дата начала
- когда все поля введены вместе
В моем классе StudentManager.java у меня есть строка SQL, как показано ниже;
final String SQL_STU = " select "
+ " t.name,"
+ " t.surname, "
+ " t.lecture,"
+ " from studenttable t "
+ " where t.school = 'CHC' "
+ " and t.id = case when '" + studentInfo.getID() + "'" +" is null then t.id else '" + studentInfo.getID() + "' end "
+ " and t.enrolldate >= case when '" + studentInfo.getStartDate() + "' is null then t.enrolldate else to_date('"
+ studentInfo.getStartDate() + "', 'DD.MM.YYYY HH24:MI:SS') end "
+ " and t.graduationdate >= case when '" + studentInfo.getEndDate() + "' is null then t.graduationdate else to_date('"
+ studentInfo.getEndDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " ;
Я выполню этот запрос и получу результаты в набор результатов.
У меня есть пара проблем с этим кодом; например, когда я закомментирую эту часть:
+ " and t.enrolldate >= case when '" + studentInfo.getStartDate() + "' is null then t.enrolldate else to_date('"
+ studentInfo.getStartDate() + "', 'DD.MM.YYYY HH24:MI:SS') end "
+ " and t.graduationdate >= case when '" + studentInfo.getEndDate() + "' is null then t.graduationdate else to_date('"
+ studentInfo.getEndDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " ;
Он работает без ошибок, но когда я даю все входные данные null (id, date1, date2), он ничего не отображает. Разве он не должен отображать все результаты, так как нет конкретного идентификатора? (Пользователь не сможет отправить 3 пустых поля, но мне любопытно, почему это не работает так, как я упоминал?)
Другое дело, когда я выполняю весь код (с частями to_date), в заголовке выдается ошибка. Но это не дает никакой ошибки, когда я выполняю так:
final String SQL_STU = " select "
+ " t.name,"
+ " t.surname, "
+ " t.lecture,"
+ " from studenttable t "
+ " where t.school = 'CHC' "
+ " and t.enrolldate >= case when '" + studentInfo.getStartDate() + "' is null then t.enrolldate else to_date('"
+ studentInfo.getStartDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " ;
Итак, в общем, я не мог написать запрос так, как хотел. Я не настолько опытен с вопросами. Если вы знаете какой-нибудь лучший способ, вы можете также предложить это, поскольку я зашел в тупик. Я тоже что-то пробовал с NVL, но не смог заставить его работать тоже.
Примечания:
- ID, StartDate, EndDate являются строкой типа в моем классе StudentInfo.java
- id - тип varchar, а даты - тип даты в таблице базы данных. (PL / SQL)