我一直在阅读Perl Hacks书中的一些食谱。配方#24“无SQL查询数据库动态”看起来很有趣。这个想法是使用SQL-Abstract为你生成SQL语句。使用SQL时where子句中列的排序::摘要
生成一个select语句的语法看起来是这样的:
my($stmt, @bind) = $sql->select($table, \@fields, \%where, \@order);
为了进一步说明,一个例子可能看起来像这样(从的perldoc拍摄):
my %where = (
requestor => 'inna',
worker => ['nwiger', 'rcwe', 'sfz'],
status => { '!=', 'completed' }
);
my($stmt, @bind) = $sql->select('tickets', '*', \%where);
上面会给你这样的事情:
$stmt = "SELECT * FROM tickets WHERE
(requestor = ?) AND (status != ?)
AND (worker = ? OR worker = ? OR worker = ?)";
@bind = ('inna', 'completed', 'nwiger', 'rcwe', 'sfz');
然后你可以在DBI代码中使用s ○:
my $sth = $dbh->prepare($stmt);
$sth->execute(@bind);
现在,有时WHERE
子句中的列的顺序是非常重要的,特别是如果你想用好指标。
但是,由于SQL-Abstract中的WHERE
子句生成器的列是通过哈希指定的 - 并且众所周知,数据从perl哈希中检索的顺序无法保证 - 您似乎失去了指定列的顺序。
我错过了什么?当使用SQL-Abstract时,是否有备用设施来保证列出现在WHERE
子句中的订单?
谢谢你,达到了预期的效果! – 2010-09-23 06:45:23