有谁知道SQL查询的DBIx :: Class等价物,例如:
SELECT cdr_id, 例如,当service_id ='GPRS'那么'KB'当service_id ='短信'然后'短信'结束为单位 来自......
由于
答案 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。