2011-08-09 10 views
0

私はこのようなSQLを生成したい:このSQLはFey :: 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` 

答えて

0

私はあなたが列以来、リテラルおよび関数オブジェクトがそれらを一緒にリンクするオペレーションを持っていないことができます(でも私にできる機能以外の任意のクラスを見ていないと思いますそれ)。私はコード生成で見ることができます

唯一の回避策は、格納された関数を作成することです:

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

そして、代わりにCOALESCEのこの機能を使用します。

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

これは実際には自明簡単です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は完全に離れることがあります。

関連する問題