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
если пользователь предоставил значение для него.