Если набор полей формы - фиксированный, т.е. количство параметров поиска не меняется, можно использовать такой код.
my $div=\'\';
my $searchstring=\'\';
if (defined($currency)) { $searchstring.=$div."tariffs.currency=\'".$currency."\'"; $div=" and "; }
if (defined($summ)) { $searchstring.=$div."(tariffs.summ=".$summ." or tariffs.backsumm=".$summ.")"; $div=" and "; }
и так все праметры. Потом:
my $sth=$dbh->prepare(\'SELECT tariffs.id as id,..... FROM tariffs
WHERE \'.$searchstring);
$sth->execute();
Вариант скорее всего не идеальный, но работает.
Только тут параметры введенные пользователем попадают в запрос к БД и их обязательно надо как следует проверить на корректность.
Более общий вариант мне создать не удалось, т.к. возникла проблема, что типы данных в БД могут быть разные, соответственно строки надо брать в кавычки, а числа не надо. Если набор параметров явно не перчислять, не ясно где числа, а где нет.