my @clauses; push @clauses, 'column1' if defined $var1; push @clauses, 'column2' if defined $var2; push @clauses, 'column3' if defined $var3; my $query = "select * from table"; if (@clauses) { $query .= " where " . join ' and ', map {"$_ = ?"} @clauses } my $result = $dbi->selectall_arrayref($query, {}, grep {defined} $var1, $var2, $var3);