2013-05-20 13 views
5

Çeşitli WHERE koşulları ile sql oluşturmanın en iyi yolu nedir? Çözümümün çirkin görünür:WHERE ekleyerek ve yer tutucuları kullanarak SQL oluşturmanın daha zarif bir yolu

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 ediyorum uzağa soyut SQL ayrıntıları. – DavidO

cevap

10

ne dersiniz:

sizin else maddeye olan ihtiyacı ortadan kaldırır
my $where = ''; 
my @values = ($from, $till); 

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

.

SQL::Abstract gibi bir şeyi de kullanabilirsiniz. $where alnını boşaltmak olacağını zaman

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, başlık altında SQL :: Abstract kullanır. $ schema-> resultset ('Calls') -> search ({time => {-buradaki, [$ from, $ till}}, $ phone tanımlandı? (phone => $ phone):()}, {order_by => {-asc => 'time'}}) -> all ' – daxim

1

1=1 durumlar için eklenir.

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

Koşullu (aka "enterprise") list-şunlardır:

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

'kurumsal'' golf için iyi görünebilir, ancak bunu başka türlü kullanmazdım. –

+3

Bunlar, Perlship Enterprise'ın yeni operatörleri ve yeni sözdizimlerini keşfedecekleri seyahatler. – friedo

İlgili konular