Получить столбцы из запроса SQL с помощью различных комбинаций фильтров в Java - PullRequest
0 голосов
/ 11 марта 2019

Я хотел бы написать запрос SQL, чтобы получить все запрошенные комбинации столбцов пользователем. Например, для пользователя таблицы: (идентификатор, имя, возраст, рост, вес)

Должна быть возможность фильтрации по параметрам [id, name], [id, name, age], [age, height], ...

Написание SQL-запроса для всех комбинаций, конечно, слишком неэффективно. Есть ли эффективный способ написания SQL-запроса с использованием PreparedStatement?

Что-то похожее на это:

 public User getByFiltered(User userDTO){

    String sql = "SELECT * FROM user WHERE id=? AND age=? AND height=?";
    PreparedStatement statement = dbConnectionManager.getConnection().prepareStatement(sql);
    ...
 }

Но в принципе можно запросить любую комбинацию столбцов.

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Вы можете сделать это с помощью:

SELECT * FROM user 
WHERE 
  (0 = ? OR id = ?) 
  AND 
  (0 = ? OR age = ?) 
  AND 
  (0 = ? OR height = ?)

Если вы хотите выполнить поиск, скажем, age = 21 и height = 175 (я предпочитаю см), и вам нет дела до идентификатора, вы передаете эти параметры:

  (0 = 0 OR id = 0) 
  AND 
  (0 = 1 OR age = 21) 
  AND 
  (0 = 1 OR height = 175)

означает, что параметр для 0 = ? будет 0, если этот столбец не имеет значения, и 1, если он имеет отношение (также параметр для id может быть любым).
Теперь, поскольку (0 = 0 OR id = 0) всегда оценивается как ИСТИНА (потому что 0 = 0 равно TRUE), он не выполняет никакой фильтрации.
Но поскольку 0 = 1 равно FALSE, другие условия: age = 21 и height = 175 должны быть TRUE.

Таким образом, у вас есть 3 + 3 параметра:
Первые 3 являются параметрами, указывающими, является ли столбец:
релевантно (поэтому вы передаете 1)
или не имеет отношения к делу (поэтому вы передаете 0).
Остальные 3 являются фактическими параметрами, которые выполняют фильтрацию (или что-то еще, если этот столбец не имеет значения).

0 голосов
/ 11 марта 2019

Лучше извлечь все записи из БД без какого-либо фильтра, а затем применить логику на уровне Java

0 голосов
/ 11 марта 2019

Это то, что вы хотите?

SELECT u.*
FROM user u
WHERE (id = ? OR ? IS NULL) AND
      (age = ? OR ? IS NULL) AND
      (height = ? OR ? IS NULL);

Обратите внимание, что это требует удвоения параметров.

Именованные параметры упрощают это:

SELECT u.*
FROM user u
WHERE (id = :id OR :id IS NULL) AND
      (age = :age OR :age IS NULL) AND
      (height = :height OR :height IS NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...