2014-02-27 31 views
0

SELECT me.id,me.date_created,me.date_updated,me.yes, me.name,me.description,me.currency,me。锁定,me.skip, me.uri_part,me.user_id, 是+货币作为重量别名DBIx :: Class结果集中两列的总和

FROM我具有((重量< 5))按重量计顺序的想法;

怎样才能在DBIx ::类,查询,而无需使用文字SQL这样的:

my $query = $rs->search({}, 
    { 
     '+select' => \[ 
      'yes + currency as weight', 
     ], 
     rows => 1, 
     order_by => { -desc => [qw/weight name/] }, 
     having => { 
      weight => { '<' => $self->yes + $self->currency }, 
     }, 
    }); 
    use Data::Dumper; 
    warn Dumper($query->as_query); 

我尝试使用-as,但是,它似乎只能是有益的与生成列的工作从功能,这样的:

'+select' => { 
    'yes + currency', '-as' => 'weight' 
} 

生成错误

“匿名散列中的奇数元素 /data/TGC/lib/TGC/DB/Result/Idea.pm line 105,line 1000. DBIx :: Class :: SQLMaker :: _ recurse_fields():格式不正确的选择参数 - 太多键在哈希:标量(0xbf14c40),重”

回答

3

也许最习惯的事情我可以想想SQL中的抽象表达式,不用紧张:

#!/usr/bin/env perl 
use Modern::Perl; 

use MySchema; 
use Data::Dumper; 

my $schema = MySchema->connect('dbi:SQLite:example.db'); 

my $rs = $schema->resultset('Sample')->search(
    { 
    weight => { '<' => 5 }, 
    }, 
    { 
    '+select' => [ 
     { '' => \'`me`.`yes` + `me`.`currency`', -as => 'weight' } 
    ] 
    } 
); 


say Dumper($rs->as_query()); 

这是一个人为包装的列名,但它做的工作,有点。只是不知道任何方式摘要在这里+。但STIL:

'(SELECT me.name,me.yes,me.currency,(me.yes + me.currency)AS体重从样品我(重量<)?)',

除非你只是去为惯用的Perl,在这种情况下:

{ '' => \(join " + ", qw/`me`.`yes` `me`.`currency`/), -as => 'weight' } 

但无论哪种方式似乎有点做作考虑两种形式比文字串长。

还要注意的是weightWHERE,而不是HAVING这是因为各种SQL引擎炸毁引用。

+0

我更新了原始查询以修复基本的SQL语法问题。最重要的是,我认为我们可能运行不同版本的SQL :: Abstract或DBIx :: Class,因为我没有得到与您一样的查询(在用您的建议子句修改原始数据后): SELECT 'me'.'id','me'.'date_created','me'.'date_updated','me'.'''','me'.'name','me'.'description','me '.'currency','me'.'locked','me'.'skip','me'.'uri_part','me'.'user_id',('me'.'yes + me'.''货币')作为'重量'从'想法''我'有'重量'<? ORDER BY'weight' DESC,'name' DESC LIMIT?) – perlDreamer

+0

您是否在谈论引用?那是因为你已经实施了“DBI驱动程序”。我所说的** HAVING **是**在每个**数据库后端都不会被**支持。所以即使它产生了,如果你切换数据库,这可能会炸毁**。 –

+0

@perlDreamer忘记在评论上标记你 –

0

的‘+作为’应该是在同一级别为‘+选择’

$idea = $rs->search({-and => [ 
    name => { '<' => $self->name }, 
]}, 
{ 
    '+select' => [ 
     'yes + currency' 
    ], 
    '+as' => [qw/weight/], 
    rows => 1, 
    order_by => ['weight', 'name'], 
    having => { 
     weight => { '<' => $self->yes + $self->currency }, 
    }, 
})->single; 
+0

+因为不会创建'select this as that that from table' syntax。 从[ResultSet文档](http://search.cpan.org/~ribasushi/DBIx-Class-0.08270/lib/DBIx/Class/ResultSet.pm#as) “as”属性没有任何内容使用SQL端AS。详情请参阅“选择”。 – perlDreamer

+0

@perlDreamer实际上它是http://search.cpan.org/~ribasushi/DBIx-Class-0。08270/lib/DBIx/Class/Manual/Cookbook.pod#Using_database_functions_or_stored_procedures – alex

+0

@perlDreamer我编辑了答案 – alex