Может ли этот SQL генерироваться с использованием Fey :: SQL? - PullRequest
0 голосов
/ 09 августа 2011

Я хочу сгенерировать SQL следующим образом:

SELECT coalesce(max(a.a_index) + 1, 0) as a_index FROM table1 a

Я могу получить все, кроме "+ 1". Есть ли способ добавить это к запросу?

use strict;

use Fey::Schema;
use Fey::Loader;

use DBI;

my $dbh = DBI->connect("DBI:mysql:....", "...", "...");

my $loader = Fey::Loader->new( dbh => $dbh );

my $s = $loader->make_schema();

my $q = Fey::SQL->new_select();

my $a_table = $s->table('table1')->alias('a');

my $a_index_col = $a_table->column('a_index');

my $max_a_index_func = Fey::Literal::Function->new('max', $a_index_col);
$max_a_index_func->set_alias_name('max_a_index');

my $c_a_index_func = Fey::Literal::Function->new('coalesce', $max_a_index_func, "0");
$c_a_index_func->set_alias_name('a_index');

$q->select($c_a_index_func);
$q->from($a_table);

print $q->sql($dbh);
print "\n";

выход

SELECT coalesce(max(`a`.`a_index`), 0) AS `a_index` FROM `table1` AS `a`

Ответы [ 2 ]

0 голосов
/ 01 октября 2014

Это на самом деле тривиально легко, если вы перестанете работать с Fey :: Literal :: Function и просто используете Fey :: Literal :: Term.Просто сделайте это:

my $c_a_index_func = Fey::Literal::Term->new('coalesce(max(', $a_index_col, ') + 1, 0)');
$c_a_index_func->set_alias_name('a_index');

Ваш $max_a_index_func может полностью исчезнуть.

0 голосов
/ 11 августа 2011

Я не думаю, что вы можете, так как объекты Column, Literal и Function не имеют операций для их связывания (и при этом я не вижу никаких классов, кроме Function, которые могут это сделать).

Единственный обходной путь, который я вижу при генерации кода, - это создание хранимой функции:

CREATE FUNCTION plus_one (n INT)
RETURNS INT DETERMINISTIC
RETURN COALESCE(n + 1, 0);

Затем используйте эту функцию вместо объединения:

my $c_a_index_func = Fey::Literal::Function->new('plus_one', $max_a_index_func);
$c_a_index_func->set_alias_name('a_index');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...