2013-05-20 31 views
5

Cách tốt nhất để xây dựng sql với số lượng điều kiện WHERE khác nhau là gì? Giải pháp của tôi trông xấu xí:cách thanh lịch hơn để xây dựng SQL thêm WHERE và sử dụng trình giữ chỗ

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 sẽ tóm tắt đi các chi tiết SQL. – DavidO

Trả lời

10

Làm thế nào về:

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

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

Đó giúp loại bỏ sự cần thiết của khoản else của bạn.

Bạn cũng có thể sử dụng một cái gì đó như 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 :: Lớp sử dụng SQL :: Tóm tắt dưới mui xe. '$ schema-> resultset ('Cuộc gọi') -> tìm kiếm ({time => {-between, [$ from, $ until]}, đã xác định $ phone? (phone => $ phone):()}, {order_by => {-asc => 'time'}}) -> all' – daxim

1

1=1 được thêm vào trong trường hợp khi $where sẽ là 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

Conditional list-bao gồm (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

'" doanh nghiệp "' có thể có vẻ tốt cho chơi gôn, nhưng tôi sẽ không sử dụng nó theo cách khác. –

+3

Đây là những chuyến đi của Perlship Enterprise, khám phá các toán tử mới và các cú pháp mới .... – friedo

Các vấn đề liên quan