2013-05-20 31 views
5

Jaki jest najlepszy sposób na skonstruowanie sql z różnymi numerami warunków WHERE? Moje rozwiązanie wygląda brzydko:bardziej elegancki sposób konstruowania SQL dodając GDZIE i używając symboli zastępczych

my ($where, @values); 
if ($phone_number) 
{ 
    $where = 'AND pnone_number=?'; 
    @values = ($from, $till, $phone_number); 
} 
else 
{ 
    $where = ''; 
    @values = ($from, $till); 
} 
my $sql = 'SELECT * FROM calls WHERE time between ? AND ? '.$where.' ORDER BY time'; 
my $res = $dbh->selectall_arrayref($sql, undef, @values) or warn 'error'; 
+0

SQL :: Maker będzie abstrakcyjnych dala szczegóły SQL. – DavidO

Odpowiedz

10

Jak o:

my $where = ''; 
my @values = ($from, $till); 

if ($phone_number) { 
    $where = 'AND phone_number=?'; 
    push @values, $phone_number; 
} 

To eliminuje potrzebę swojej klauzuli else.

Można również użyć czegoś takiego, jak SQL::Abstract.

use SQL::Abstract; 

... 

my ($sql, @values) = SQL::Abstract->new->select(
    'calls',             # table 
    '*',              # columns 
    { time => { '<=' => $till, '>' => $from },     # where clause 
     $phone_number ? (phone_number => $phone_number) : (), 
    }, 
    'time'              # order clause 
); 
+0

DBIx :: Class używa SQL :: Abstract pod maską. '$ schema-> zestaw wyników ('Połączenia') -> wyszukiwanie ({time => {-between, [$ od, $ until]}, zdefiniowany $ phone? (phone => $ phone):()}, {order_by => {-asc => 'time'}}) -> all' – daxim

1

1=1 dodaje do przypadków, gdy $where byłoby epmty.

my $where = "AND time between ? AND ? "; 
my @values = ($from, $till); 

if ($phone_number) { 
    $where .= 'AND pnone_number=? '; 
    push @values, $phone_number; 
} 

my $sql = 'SELECT * FROM calls WHERE 1=1 $where ORDER BY time'; 
my $res = $dbh->selectall_arrayref($sql, undef, @values) or warn 'error'; 
0

Warunkowe lista obejmują (aka "enterprise"):

my @values = ($from, 
       $till, 
       ($phone_number) x !! $phone_number, 
      ); 

my $sql = 'SELECT * FROM calls WHERE time between ? AND ? ' 
     . 'AND phone_number=?' x !! $phone_number 
     . ' ORDER BY time'; 
+1

'' enterprise "' może dobrze wyglądać w golfa, ale nie użyłbym go inaczej. –

+3

To są rejsy Perlship Enterprise, odkrywanie nowych operatorów i nowych składni .... – friedo