2012-02-08 13 views
7

किसी को भी इस तरह के रूप एक SQL क्वेरी की DBIx :: कक्षा बराबर क्या पता है:मामले के लिए डीबीआईएक्स :: कक्षा वाक्यविन्यास क्या है ... फिर एसक्यूएल वाक्यविन्यास?

चयन cdr_id, मामला है जब service_id = 'जीपीआरएस' फिर 'KB' जब service_id = 'एसएमएस' फिर 'एसएमएस' अंत के रूप में इकाई से ...

धन्यवाद इस रेखा के साथ

उत्तर

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

यह समाधान वास्तव में काम करता है। मुझे खेद है कि एकमात्र चीज यह है कि यह वस्तुओं के उपयोग के साथ एसक्यूएल वाक्यविन्यास मिश्रण करता है। इसलिए, अगर हमें कुछ एसक्यूएल बिट्स रखने के लिए मजबूर किया जाता है, तो क्या डीबीआईएक्स :: क्लास को सरल डीबीआई पर उपयोग करने में वास्तविक रुचि है? – galli2000

+1

आपकी वांछित केस अभिव्यक्ति को शामिल करने का कोई अन्य तरीका नहीं है। यह डीबीआईएक्स :: कक्षा की ऑब्जेक्ट सिंटैक्टिक चीनी में शामिल नहीं है। – dgw

+1

@ galli2000 डीबीआईसी सिर्फ एक एसक्यूएल जेनरेटर नहीं है। यह उपयोगी वस्तुओं, prunes में शामिल होने की स्थिति, और भी बहुत कुछ उत्पन्न करता है। –

-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({}, { ... }); 

इस विधि की अच्छी बात यह है कि यह जटिल प्रश्न (जैसे कि जब आप एक से अधिक जटिल मिलती है या यूनियनों, उप चयन है की अनुमति देता है इत्यादि) को अपने कोड से एक परिणाम स्रोत :: वीआई में छिपाने के लिए ईडब्ल्यू, तो आप एसक्यूएल सिंटैक्स और ऑब्जेक्ट्स का मिश्रण छिपाते हैं

संबंधित मुद्दे