Существует несколько подходов к этому, но в идеале вы должны использовать параметризованные запросы, а не конкатенацию строк значений поиска;когда кто-то говорит, что ищет такие имена, как «O'reilly», ваш запрос обанкротился.(См. Google для "таблиц выпадения Бобби").
Однако, поскольку вы используете конкатенацию строк, почему бы просто не проверить значения полей на пустые при построении запроса?
В качестве альтернативы используйтепараметризованный запрос примерно так:
SELECT *
FROM table
WHERE (@p1 = '' OR `Name` LIKE @p1)
AND (@p2 = '' OR `Nachname` LIKE @p2)
AND (@p3 = '' OR `Alter` LIKE @p3)
;
При таком способе использования:
mycommand.CommandText = theQueryAbove;
mycommand.Parameters.AddWithValue("@p1", textbox1.Text);
mycommand.Parameters.AddWithValue("@p2", textbox2.Text);
mycommand.Parameters.AddWithValue("@p3", textbox3.Text);
var rdr = mycommand.ExecuteReader();
Лучшим решением, вероятно, является создание параметризованного запроса на основе соответствующих текстовых полей, который толькосодержит параметры для соответствующих.Name LIKE @p1
может быть быстрее, чем (@p1 = '' OR Name LIKE @p1)
;Оптимизатор MySQL может автоматически упростить его на основе значения @p1
, но он все равно может ухудшить другие способы оптимизации такого запроса.