2012-02-08 78 views

回答

6
my $rs = $schema->resultset('table')-> 
    search_rs({} , 
       { '+columns' => { 
        unit => 
         \do { "CASE WHEN me.service_id='GPRS' THEN 'KB' " . 
           "WHEN me.service_id='SMS' THEN 'SMS' END" } 
       }) ; 

東西沿着這條線應該工作。

+0

此解決方案確實有效。我唯一感到遺憾的是它將SQL語法與對象使用混合在一起。所以,如果我們被迫保留一些SQL位,是否真的有興趣使用DBIx :: Class而不是簡單的DBI? – galli2000 2012-02-08 22:50:12

+1

我沒有其他方法可以包含您想要的案例表達。它不包含在DBIx :: Class的對象語法糖中。 – dgw 2012-02-08 22:55:00

+1

@ galli2000 DBIC不僅僅是一個SQL生成器。它還會生成有用的對象,修剪連接條件等等。 – 2013-05-03 12:46:38

-1

創建填入表 「service_units」:

service | unit 
--------+----- 
GPRS | KB 
SMS  | SMS 

然後

SELECT 
    cdr.cdr_id, service_units.unit 
FROM 
    cdr INNER JOIN service_units ON cdr.service_id = service_units.service 

然後翻譯成DBIx ::課堂上發言。

2

另一種方式來處理複雜的查詢是在確定他們DBIx::Class::ResultSource::View像這樣:

package My::Schema::Result::ComplexQuery 
use strict; 
use warnings; 
use base qw/DBIx::Class::Core/; 

__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); 
__PACKAGE__->table('tablename'); 
__PACKAGE__->result_source_instance->is_virtual(1); 
__PACKAGE__->result_source_instance->view_definition(
    q[ 
     SELECT cdr_id, 
     CASE WHEN service_id = 'GPRS' THEN 'KB' WHEN service_id = 'SMS' THEN 'SMS' END AS unit 
     FROM table 
    ] 
); 

,那麼你可以調用它,你通常會調用dbix ::類,你會得到一個DBIx: :類:: ResultSet對象(這將不允許更新或刪除,雖然):

my $pruned_cdr = $schema->resultset('ComplexQuery')->search({}, { ... }); 

這種方法的好處是,它可以讓複雜的查詢(當你有多個複雜的連接或合併,子像選擇等等)從您的代碼隱藏到一個ResultSource :: Vi中因此,您隱藏了SQL語法和對象的組合