Порядок столбцов в предложении where при использовании SQL :: Abstract - PullRequest
2 голосов
/ 22 сентября 2010

Я читал некоторые рецепты в книге Perl Hacks. Рецепт № 24 «Запросы к базам данных динамически без SQL» выглядел интересно. Идея состоит в том, чтобы использовать SQL-Abstract для генерации оператора SQL для вас.

Синтаксис для генерации оператора выбора выглядит примерно так:

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 ?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

Я изначально неверно истолковал ваш вопрос.

Вы можете использовать -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";

См. Вложенные условия, -и / -или префиксы .

0 голосов
/ 22 сентября 2010

Этот модуль не может делать все - он предназначен для удобства построения запросов, которые будут выполнять работу "большую часть времени".Иногда вам все еще может потребоваться написать запрос вручную.Я использую SQL :: Abstract в своем основном $ work :: app и никогда не сталкивался с ситуацией, которую вы описываете.Хороший механизм SQL будет знать, какие ключи индексируются, и оптимизировать запрос, чтобы использовать их в первую очередь, независимо от того, какой порядок вы указали.Вы уверены, что ваш движок не тот же, и что порядок, который вы указываете в запросе, действительно важен?

Если вам действительно нужно упорядочить предложения WHERE в особом порядке, вам может быть прощевместо этого напишите подзапросы.SQL :: Abstract также может сделать это проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...