CASE WHEN ...那么SQL语法的DBIx :: Class语法是什么?

时间:2012-02-08 19:11:54

标签: perl dbix-class

有谁知道SQL查询的DBIx :: Class等价物,例如:

SELECT cdr_id, 例如,当service_id ='GPRS'那么'KB'当service_id ='短信'然后'短信'结束为单位 来自......

由于

3 个答案:

答案 0 :(得分: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" }
               } ) ;

这条线上的东西应该有用。

答案 1 :(得分: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 :: classes一样,你将获得一个DBIx :: Class :: ResultSet对象(但不允许更新或删除):

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

这种方法的好处是它允许复杂的查询(比如当你有多个复杂的连接或联合,子选择等)从你的代码隐藏到ResultSource :: View中,所以你隐藏SQL的混合语法和对象

答案 2 :(得分:-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 :: Class speak。