使用SQL::Abstract时where子句中列的排序

使用SQL::Abstract时where子句中列的排序,sql,perl,Sql,Perl,我一直在阅读Perl Hacks手册中的一些食谱。不使用SQL动态查询数据库看起来很有趣。这个想法是用来为您生成SQL语句 生成select语句的语法如下所示: my($stmt, @bind) = $sql->select($table, \@fields, \%where, \@order); 为了进一步说明,可以从perldoc中选取如下示例: my %where = ( requestor => 'inna', worker => ['nwiger', '

我一直在阅读Perl Hacks手册中的一些食谱。不使用SQL动态查询数据库看起来很有趣。这个想法是用来为您生成SQL语句

生成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代码中使用,如下所示:

my $sth = $dbh->prepare($stmt);
$sth->execute(@bind);
现在,有时WHERE子句中列的顺序非常重要,特别是如果您想充分利用索引的话

但是,由于中WHERE子句生成器的列是通过哈希指定的,并且众所周知,从perl哈希中检索数据的顺序无法保证,因此您似乎失去了指定列顺序的能力


我错过什么了吗?使用WHERE子句时,是否有其他工具来保证列出现在WHERE子句中的顺序?

我最初误解了你的问题

您可以使用-和来实现所需的订购

例如:

#!/usr/bin/perl

use strict; use warnings;

use SQL::Abstract;

my $sql = SQL::Abstract->new;

my ($stmt, @bind) = $sql->select(
    tickets => '*',
    {
        -and => [
            requestor => 'inna',
            status => { '!=', 'completed' },
            worker => ['nwiger', 'rcwe', 'sfz'],
        ],
    }
);

print "$stmt\n";

请参阅。

此模块无法完成所有工作-它的目的是为了方便构建大部分时间都能完成任务的查询。有时您可能仍然需要手工编写查询。我在主要的$work::应用程序中使用SQL::Abstract,从未遇到过您描述的情况。一个好的SQL引擎将知道哪些键被索引,并优化查询以首先使用这些键,而不管您指定的顺序如何。您确定您的引擎不同,并且您在查询中指定的顺序非常重要吗


如果确实需要按特殊顺序排列WHERE子句,您可能会发现编写子查询更容易。SQL::Abstract也可以简化此操作。

谢谢,这达到了预期的效果!谢谢,我没有考虑到SQL引擎会优化查询以使用索引键。在mysql中,似乎还有一个额外的约束:如果列不构成索引最左边的前缀,mysql就不能使用索引——因此至少必须保证WHERE子句的这部分顺序。