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="" и т. Д. Потенциально все поля a, b, c, d, e могут быть пустыми ("") Если поле опущено, оно не должно влиять на итоговый ответ. Другими словами, если c не введен, результат может содержать записи, где c ИСТИНА или ЛОЖЬ

Вопрос:

Как мне написать ОДИН запрос, который охватывает ситуацию, когда потенциально все поля могут быть пустыми, или только некоторые, или ни одного?

3 ответа

Вы могли бы использовать

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

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

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

(B_input=''
 Or (b_input=''true' and b)
   Or (b_input='false' and ((not b)))

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

Другие вопросы по тегам