Вы можете сделать это с помощью:
SELECT * FROM user
WHERE
(0 = ? OR id = ?)
AND
(0 = ? OR age = ?)
AND
(0 = ? OR height = ?)
Если вы хотите выполнить поиск, скажем, age = 21
и height = 175
(я предпочитаю см), и вам нет дела до идентификатора, вы передаете эти параметры:
(0 = 0 OR id = 0)
AND
(0 = 1 OR age = 21)
AND
(0 = 1 OR height = 175)
означает, что параметр для 0 = ?
будет 0
, если этот столбец не имеет значения, и 1
, если он имеет отношение (также параметр для id
может быть любым).
Теперь, поскольку (0 = 0 OR id = 0)
всегда оценивается как ИСТИНА (потому что 0 = 0
равно TRUE
), он не выполняет никакой фильтрации.
Но поскольку 0 = 1
равно FALSE
, другие условия: age = 21
и height = 175
должны быть TRUE
.
Таким образом, у вас есть 3 + 3 параметра:
Первые 3 являются параметрами, указывающими, является ли столбец:
релевантно (поэтому вы передаете 1
)
или не имеет отношения к делу (поэтому вы передаете 0
).
Остальные 3 являются фактическими параметрами, которые выполняют фильтрацию (или что-то еще, если этот столбец не имеет значения).