2016-12-06 4 views
0

На высоком уровне это звучит тривиально, но, оказывается, я почесываю голову на пару часов.MySQL SELECT с переменными полями WHERE

Ситуация:

У меня есть таблица T с колоннами a,b,c,d,e. Столбец a содержит строку, в то время как у b,c,d,e каждое значение имеет булево значение.

Я разрешаю пользователю выполнить вид , где я предлагаю пользователю ввести значения для a,b,c,d,e и вернуть все строки, в которых все эти значения совпадают.

В идеальном мире, пользователь вводит все значения (позволяет говорить a="JavaScript", b="true", c="false", d="false", e="true") и полученный запрос (В Scala, ссылки на удаленную БД под управлением MySQL) может выглядеть примерно так:

connection.createStatement().executeQuery("SELECT * FROM T 
WHERE a = '" + a_input + "' 
and b = " + b_input + " 
and c = " + c_input + " 
and d = " + d_input + " 
and e = " + e_input + ";") 

Проблема:

я дать пользователю возможность «разрыхления» ограничений, поэтому вполне возможно, что a_input = «» и b_input = «», и т.д. ... Потенциально все поля а, б, в, г, д может быть пустым («») Если поле опущено, оно не должно влияют на полученный ответ. Другими словами, если c не введен, то результат может содержать записи, где c является ИСТИНА или FALSE

Вопрос:

Как написать ONE запрос, который описывает ситуацию, потенциально все поля могут быть пустыми, или просто некоторые, или нет?

+0

так: 'где (b_input = '' или Ь = b_input) и (...)' –

ответ

0

можно использовать

Select * 
from table 
where a in ('','othervalue','othervalue') 
and b in ('','othervalue','morevalues') 

и так далее ..... это как используя или для каждого поля, и это будет соответствовать, даже если он пустой

+0

Спасибо. Если поле1 равно "", будет ли он искать экземпляры, где field1 = "", или он полностью игнорирует поле1? Если первое, это не функциональность, в которой я нуждаюсь. Я обновил раздел «Проблема» в OP, чтобы подробно описать, что мне нужно. –

+0

Он будет соответствовать в любом случае, потому что вам нужно заполнить ЛЮБОЙ из этих значений для каждого поля, это похоже на использование OR .....'' или othervalue 'или' morevalues ​​', просто попробуйте, и вы увидите, что это работает. – Juan

+0

Возможно, меня неправильно поняли, но я попробую этот запрос и дам вам знать, если он работает, спасибо. –

0

Просто построить WHERE динамически. Вместо того, чтобы всегда искать c = 'whatever', включите c в WHERE, если пользователь предоставил для него значение.

+0

Как это сделать в одном запросе - вопрос без тонны if() проверки того, было ли значение поставляется? –

+0

Единственный другой вариант - использовать ответ juergen d's в главном разделе комментариев выше. Я не знаю, что Хуан пытается сказать – CptMisery

+0

Ответ Юргена такой же, как у меня, единственное отличие в том, что я использую предложение IN, но смысл точно такой же ... – Juan

0

Это сложно, потому что БД содержит булевы, но цепочки представляют собой строки. Ярлыки всегда пустые. 'правда или ложь'? Если это так попробуйте

(B_input='' 
Or (b_input=''true' and b) 
    Or (b_input='false' and ((not b))) 
Смежные вопросы