2017-01-09 3 views
3

У меня есть запрос:Как я могу ввести «переменные» предложения WHERE в запрос?

SELECT * FROM table_name WHERE name=? surname=? gender=?;

, и я должен вводить строки в запросе (я использую подготовленное заявление), но проблема в том, что эти 3 статьи являются переменными; Я могу иметь 0, 1, а также все 3 предложения, действующие на основе ввода, который пользователь делает.

Как я могу «игнорировать» каждый из них, если пользователь ничего не вводит для этого?

Спасибо всем!

РЕДАКТИРОВАТЬ: это также хорошо, если кто-либо знает, как setStrin() для подготовленного элемента, не позволяя ему помещать ' ' вокруг строки.

+0

динамический SQL для победы. –

+0

Либо подготовьте все семь возможных комбинаций (8, если предложение не является также опцией), либо постройте запрос динамически. – RealSkeptic

+2

Возможный дубликат [Подготовленный оператор с предложением dynamic where) (http://stackoverflow.com/questions/15405288/prepared-statement-with-dynamic-where-clause) – Berger

ответ

3

Самым простым решением будет построить свой подготовленное заявление динамически, что-то вроде этого:

String sql = "SELECT * FROM table_name"; 

if (nameInput != null || surnameInput != null || genderInput != null) 
{ 
    sql += " WHERE "; 
} 

if (nameInput != null) 
{ 
    sql += "name=? "; 
} 

Я думаю, вы получите идею оттуда для других входов.

Затем вы можете передать окончательное значение sql в свой звонок prepare вместе с входными значениями.

+0

Извините, я видел тег [mysql] и рефлексивно закодировал свой ответ на PHP. Я надеюсь, что моя попытка Java - это нормально (по крайней мере, в том смысле, что вы можете это понять). –

+0

, но таким образом инъектируется! Я хочу предотвратить это (поэтому я использую prepareStatement с setString() –

+1

@ClaudioCiociola. Это не инъектируется, потому что вы строите скелет * запроса * динамически, но вы добавляете значения пользователя только к подготовленному оператору. – RealSkeptic

1

Легко сделать без какого-либо сложного или дорогостоящего логики, в одной строке ...

Предполагая, что ваши три переменные @name, @surname и @gender.

Также предполагается, что строка с нулевой длиной будет предоставлена, когда фильтр не требуется.

Затем ваш Выберите утверждение просто:

select * from table_name where (name = @name or @name = '') and (surname = @surname or @surname = '') and (gender = @gender or @gender = '') 

Это все есть на него! Никакой сложной или дорогостоящей логики.

Смежные вопросы