выберите где параметр =?но если ?пустое пространство, вернуть любое значение для этого столбца - PullRequest
0 голосов
/ 15 ноября 2018

Получение некоторых строк, целых и дат из моего запроса, например:

String city = request.getParameter("city");

Эти значения написаны пользователем в моей сети. Проблема в том, что, если мой пользователь хочет не заполнять ввод, например, город, запрос должен учитывать, что город может иметь любое значение. Поскольку я получу пробел в моем request.getParameter (если пользователь не заполняет введенный текст), я попытался сообщить запросу, что, если параметр является пробелом, он должен возвращать любое значение. Я попробовал:

String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE (city = ? OR ? = '')AND init_date <= ? AND end_date >= ? AND (price = ? OR ? = '') AND (guests = ? OR ? = '')"; 

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city);
stmt.setString(2, city);
stmt.setDate(3, new java.sql.Date(initDate.getTime()));
* and so on... *

Запрос выполняется, но он не возвращает никаких корпусов. Как я могу указать, что ? может быть любым значением, если оно связано с параметром, который является пробелом?

PD: Я бы предпочел не создавать динамическое предложение WHERE, добавлять или удалять объекты из запроса.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

В вашем коде вы пытаетесь передать имя столбца в качестве аргумента, но это не работает.Вам разрешено передавать значения только для столбцов.Я предлагаю другое решение вашей проблемы.Рассмотрим это более простое утверждение:

String getResults = "SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE (city = ? OR 1 = ?)

(1) Если пользователь ввел действительное значение, тогда ваш код будет:

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, city_text);
stmt.setString(2, 0);

, поэтому предложение WHERE выглядит следующим образом:

WHERE (city = city_text OR 1 = 0)

, поскольку 1 = 0 всегда равно false, оставшаяся часть city = city_text будет извлекать нужные строки.

(2) Если пользователь ввел значение , а не , тогда ваш код будет:

PreparedStatement stmt = con.prepareStatement(getResults);
stmt.setString(1, "");
stmt.setString(2, 1);

, поэтому предложение WHEREвыглядит так:

WHERE (city = '' OR 1 = 1)

, поскольку 1 = 1 всегда true, весь логический оператор (city = '' OR 1 = 1) будет true, так как он даже не существует.

Таким образом, вы должны проверить введенное или не введенное значение и настроить параметры для передачи в любом случае.Это просто идея, которую вы можете расширить для большего количества столбцов.

0 голосов
/ 16 ноября 2018

В вашем предложении where, (city = ? OR ? = '') должно быть (city = ? OR city = '').

Итак:

SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE (city = ? OR city = '') 
    AND init_date <= ? AND end_date >= ? 
    AND (price = ? OR price = '') 
    AND (guests = ? OR guests = '')

Это будет эквивалентно:

SELECT id_housing, name, description_short, price, photo FROM housing 
WHERE city in ('', ?)
    AND init_date <= ? AND end_date >= ? 
    AND price in ('', ?)
    AND guests in ('', ?)

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

0 голосов
/ 15 ноября 2018

Предположим, что если параметр пуст, вы получите список результатов.Если вы готовы к этому, то добавьте параметр в запрос с условием, если оно не пустое или не пустое.Вытащить данные на пустой является неправильным.Рассмотрим проектирование по-другому.Если есть много пустых результатов, вы не можете сохранить индекс на пустом значении.Тогда это вызовет проблему производительности.

...