my %where_type = ( type1 => { _1_job => 'LIKE', _2_host_name => 'LIKE', _3_server => 'LIKE' }, type2 => { _1_job => '=', _2_host_name => '=', _3_time_stamp => 'LIKE' }, type3 => { _1_user_id => '!=', _2_user_id => 'LIKE', _3_time_stamp => '>' }, ); sub build_sql { my ( $type ) = @_; my $sql = "SELECT job,time_stamp,host_name,ip_address,server FROM cf_status_log"; my @where_clauses = (); if ( exists( $where_type{$type} )) { for my $key ( sort keys %{$where_type{$type}} ) { ( my $fld = $key ) =~ s/^_\d_//; push @where_clauses, "$fld $where_type{$type}{$key} ?"; } } $sql .= " where ".join( " and ", @where_clauses ) if @where_clauses; }