Что такое синтаксис DBIx :: Class для CASE WHEN ... THEN синтаксиса SQL? - PullRequest
8 голосов
/ 08 февраля 2012

Кто-нибудь знает, что такое DBIx :: Class эквивалент SQL-запроса, например:

SELECT cdr_id,
CASE WHEN service_id = 'GPRS' THEN 'KB' WHEN service_id = 'SMS' THEN 'SMS' END AS unit
FROM ...

Спасибо

Ответы [ 3 ]

6 голосов
/ 09 февраля 2012
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" }
               } ) ;

Что-то в этом направлении должно работать.

2 голосов
/ 16 июня 2012

Другой способ справиться со сложными запросами - определить их в 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 и объектов

0 голосов
/ 11 февраля 2012

Создайте таблицу "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.

...