gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:45:57 24 4
gpt4 key购买 nike

我一直在阅读 Perl Hacks 书中的一些食谱。秘诀#24“无需SQL 动态查询数据库”看起来很有趣。这个想法是使用 SQL-Abstract为您生成 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 SQL-Abstract 中的子句生成器通过散列指定 - 众所周知,无法保证从 perl 散列中检索数据的顺序 - 您似乎失去了指定列顺序的能力。

我错过了什么吗?是否有替代工具来保证列出现在 WHERE 中的顺序?使用条款时 SQL-Abstract ?

最佳答案

我最初误解了你的问题。

您可以使用 -and以达到所需的排序。

例如:

#!/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";

Nested conditions, -and/-or prefixes .

关于sql - 使用 SQL::Abstract 时 where 子句中的列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3770247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com