は、誰もがSQLクエリなどのDBIx ::クラスと同等の何を知っています:CASE WHEN ... THEN SQL構文のDBIx :: Class構文は何ですか?
SELECT cdr_id、 CASE WHENのservice_id = 'GPRS' THEN 'KB' WHENのservice_id = 'SMS' THEN 'SMS' END ASユニット この線に沿って何かが動作するはずのおかげ
は、誰もがSQLクエリなどのDBIx ::クラスと同等の何を知っています:CASE WHEN ... THEN SQL構文のDBIx :: Class構文は何ですか?
SELECT cdr_id、 CASE WHENのservice_id = 'GPRS' THEN 'KB' WHENのservice_id = 'SMS' THEN 'SMS' END ASユニット この線に沿って何かが動作するはずのおかげ
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" }
}) ;
... FROM。
移入テーブル "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にそのを翻訳::クラスは話します。
複雑なクエリに対処するための別の方法は、それらを定義することです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構文とオブジェクトの混在を隠します
このソリューションは実際に動作します。私が後悔しているのは、オブジェクトとSQL構文を混在させるということだけです。ですから、SQLの一部を残しておく必要がある場合は、DBIx :: Classを単純なDBIよりも使用することに本当に関心がありますか? – galli2000
希望のケース式を含めることが他には分かりません。これは、DBIx :: Classのオブジェクト構文糖には含まれていません。 – dgw
@ galli2000 DBICは単なるSQLジェネレータではありません。また、便利なオブジェクト、プルーン結合条件などを生成します。 –