SQL игнорирует пустой пользовательский ввод в предложениях WHERE - PullRequest
0 голосов
/ 27 ноября 2018

userInput

Я пытаюсь выяснить это в течение двух дней, но все ответы слишком сложны.Мне нужно простое, простое решение, пожалуйста.

Я хочу создать функцию поиска книг, используя формы HTML и запросы POST к сервлету молы.Пользователь может выполнить поиск, используя название книги, имя автора или диапазон цен.В зависимости от ввода пользователя я сгенерирую SQL-запрос.Мой запрос выглядит так: -

(title, author и minPrice, maxPrice являются пользовательскими переменными ввода).

SELECT * 
FROM books 
WHERE Title LIKE '%title%' 
   OR Author LIKE '%author%' 
   OR Price BETWEEN minPrice AND maxPrice;

Если пользователь устанавливает диапазон цен,это работает отлично.Но если они этого не делают, запрос заканчивается:

SELECT * 
FROM books 
WHERE Title LIKE '%%' 
   OR Author LIKE '%%' 
   OR Price BETWEEN  AND;

, и это ничего не возвращает.

Как лучше всего это сделать?

Java-код:

query = "SELECT * 
         FROM books 
         WHERE Title LIKE '%" + request.getParameter("title") + "%' 
            OR Author LIKE '%" + request.getParameter("author") + "%' 
            OR Price BETWEEN " + request.getParameter("minPrice") + 
                      " AND " + request.getParameter("maxPrice") + ";"; 

Ответы [ 4 ]

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

Я не знаю Java, но этот SQL-запрос будет работать

SELECT * 
FROM books 
WHERE Title LIKE '%title%' 
   OR Author LIKE '%author%' 
   OR (minPrice is null or maxPrice is null or Price BETWEEN minPrice AND maxPrice);


query = 

"SELECT * 
             FROM books 
             WHERE Title LIKE '%" + request.getParameter("title") + "%' 
                OR Author LIKE '%" + request.getParameter("author") + "%' 
                OR (" + request.getParameter("minPrice") + " is null 
                     or " + request.getParameter("maxPrice") + " is null
                     or
                     Price BETWEEN " + request.getParameter("minPrice") + 
                          " AND " + request.getParameter("maxPrice") + ");"; 
0 голосов
/ 27 ноября 2018
SELECT * 
FROM books 
WHERE (Title LIKE '%title%' or title IS NULL)
   OR (Author LIKE '%author%' or author IS NULL)
   OR (Price BETWEEN minPrice AND maxPrice or minPrice IS NULL or maxPrice IS NULL);
0 голосов
/ 27 ноября 2018

Похоже, что вы в настоящее время не используете подготовленное заявление.Лучшее, что можно здесь сделать, - это иметь отдельные подготовленные операторы, которые вы используете, в зависимости от того, какие входные данные определены, а какие нет.

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

String title = request.getParameter("title");
String author = request.getParameter("author")
String minPriceStr = request.getParameter("minPrice");
Integer minPrice = minPriceStr != null ? Integer.parseInt(minPriceStr) : null;
String maxPriceStr = request.getParameter("maxPrice");
Integer maxPrice = maxPriceStr != null ? Integer.parseInt(maxPriceStr) : null;

String sql = "SELECT * FROM books WHERE Title LIKE ? OR Author LIKE ? OR ";
sql += "Price BETWEEN ? AND ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, title != null ? "%" + title + "%" : "%%");
ps.setString(2, author != null ? "%" + author + "%" : "%%");
ps.setInt(3, minPrice != null ? minPrice : -1);
ps.setInt(4, maxPrice != null ? maxPrice : 10000000);
ResultSet rs = ps.executeQuery();

// process result set
while (rs.next()) {
}

В этом ответе используется несколько хитростей,Во-первых, для null названий или авторов мы связываем %% с выражениями LIKE.Это будет означать, что эти выражения всегда будут правдой и даже не будут присутствовать.Для минимальной и максимальной цены мы проверяем, отсутствуют ли они, и в этом случае заменяем на -1 и 10000000 соответственно.Это предполагает, что у вас никогда не будет цены меньше 0 или цены больше 10 миллионов.

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

Просто используйте проверку для этого, так что вы говорите в Коде, что диапазон цен должен быть не нулевым, и / или 0 в противном случае отображать сообщение на экране и не удастся.Есть и другие способы сделать это, чтобы ограничить, когда нет ввода, например, проверка PrimeFaces.Или вы просто определяете значения по умолчанию, если ввод равен нулю.Всего 3 тысячи решений.В будущем также предоставьте некоторую информацию о том, что вы используете и как выглядит ваш код, чтобы мы могли дать точный ответ на эту проблему.

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