2010-05-26 9 views
6

मेरे पास फ़ील्ड के साथ एक मेनेसिया टेबल है जो एफ 1, एफ 2, एफ 3 कहती है। अब अगर मैं फ़ील्ड वैल्यू के साथ सभी पंक्तियों को V1 के रूप में चुनना चाहता हूं, तो मैं mnesia:select का उपयोग करूंगा और विशिष्ट विनिर्देशों या साधारण mnesia:match_object से मिलान करूंगा। अब मुझे उन सभी पंक्तियों को चुनने की ज़रूरत है जिनमें V1, V2, V3 ... या Vn (मनमानी लंबाई की एक सूची) फ़ील्ड f1 के मान के रूप में है। एसक्यूएल में मैंएरलैंग मेनेसिया एसक्यूएल के समकक्ष जहां से फ़ील्ड इन (फ़ील्ड 1, वैल्यू 2, वैल्यू 3, ...)

SELECT * FROM tablename WHERE f3 IN (V1, V2, V3, ... , Vn) 

मैनेशिया में ऐसा कैसे करूं?

उत्तर

5

और इस समस्या का मैच कल्पना समाधान के लिए, अगर QLC पर्याप्त कुशल नहीं के रूप में मापा जाता है।

> ets:fun2ms(fun ({_,X}=E) when X == a -> E end). 
[{{'_','$1'},[{'==','$1',a}],['$_']}] 

ETS: fun2ms एक को बदलने पार्स कि matchspec मूल्यों में कुछ funs अनुवाद कर सकते हैं है। मैं इसे मैचस्पेक प्राप्त करने के लिए एक तेज़ तरीका के रूप में उपयोग करता हूं। हमें एक मैचस्पेक के साथ एक सूची मिलती है जो एक ट्यूपल पाती है जहां दूसरा तत्व ए है। हम इसे अन्य चाबियों के लिए दोहरा सकते हैं।

तो चलिए इसे आज़माने के लिए किसी चीज के साथ एक आइलेट टेबल तैयार करते हैं, फिर एक मैचस्पेक बनाएं जो केवल दूसरे तत्व वाले 'ए' या 'सी' के साथ मेल खाता हो। (मैं इस

ets:new(foo, [named_table]). 

ets:insert(foo, [{1,a},{2,b},{3,c},{4,d}]). 

Vs = [a,c]. 

MS = [{{'_','$1'},[{'==','$1',V}],['$_']} || V <- Vs]. 

ets:select(foo, MS). 

दर्ज करते हैं मैं इस चलाने मैं:

[{1,a},{3,c}] 
2

यदि आपको "जटिल" प्रश्नों की आवश्यकता है तो क्यूएलसी उन्हें बताने का एक संक्षिप्त तरीका है। क्यूएलसी एक पार्स-ट्रांसफॉर्म है जो आपको मेनेसिया टेबल सहित विभिन्न तालिकाओं पर सूची समझ वाक्यविन्यास का उपयोग करने की अनुमति देता है।

आप में निम्नलिखित शामिल हैं, क्योंकि यह पार्स-ट्रांसफॉर्म को सक्षम करता है जो इस स्रोत फ़ाइल में QLC को संभव बनाता है।

-include_lib("stdlib/include/qlc.hrl"). 

बुनियादी क्वेरी प्रपत्र निम्नलिखित के रूप में लग रहा है, एक प्रश्न-संभाल बनाने और फिर क्वेरी का मूल्यांकन।

QH = qlc:q([X || X <- Xs]), 
qlc:eval(QH). 

फिर आप http://www.erlang.org/doc/man/mnesia.html#table-1 का प्रयोग कर एक QLC तालिका एक mnesia तालिका में वापस एंडेड प्राप्त करने के लिए कर सकते हैं। तो आपकी क्वेरी निम्नलिखित के रूप में लागू की जा सकती है:

Vs = [V1,V2,...Vn], 
QH = qlc:q([X || X <- mnesia:table(tablename), 
       lists:member(X#tablename.f3, Vs)]), 
qlc:eval(QH). 

इसके लिए एक टेबल-स्कैन की आवश्यकता होती है, जो बहुत ही कुशल नहीं है। यदि आपके पास f3-column पर कोई अनुक्रमणिका है तो आप इसके बजाय इसे चालू कर सकते हैं और F3 = V1, फिर V2, आदि के साथ प्रविष्टियों के लिए पहले पूछ सकते हैं ... और परिणामों को मर्ज करें। का चयन करें:

पुनश्च

एक वैकल्पिक वि मूल्यों की अपनी सूची से बाहर एक काफी जटिल मैच कल्पना बना सकते हैं और mnesia चलाने के लिए है।

3

Christian अच्छा समाधान बताया, लेकिन यह थोड़ा आसान सा

2> ets:fun2ms(fun ({_,a}=E) -> E end).    
[{{'_',a},[],['$_']}] 

तो के लिए आप आप से मेल किया जा सकता है सरल मिलान spec

4> ets:new(foo, [named_table]). 
foo 
5> ets:insert(foo, [{1,a},{2,b},{3,c},{4,d}]). 
true 
6> Vs = [a,c]. 
[a,c] 
7> MS = [{{'_',V},[],['$_']} || V <- Vs].     
[{{'_',a},[],['$_']},{{'_',c},[],['$_']}] 
8> ets:select(foo, MS). 
[{1,a},{3,c}] 
बना सकता है
संबंधित मुद्दे