2010-04-01 12 views
10

मुझे आश्चर्य है कि डेटा को प्रतिस्थापित करने के लिए SQLite (या अन्य SQL इंजन) में CASE कथन का उपयोग करने की सलाह नहीं दी जाती है। उदाहरण के लिए कहें कि मेरे पास एक प्रश्न है।SQLite CASE कथन महंगा है?

SELECT Users, 
       CASE WHEN Active = 0 THEN 'Inactive' 
         WHEN Active = 1 THEN 'Active' 
         WHEN Active = 2 THEN 'Processing' 
         ELSE 'ERROR' END AS Active 
FROM UsersTable; 

संदर्भ तालिका बनाने और जॉइन करने के लिए बेहतर कब होता है। इस मामले में मैं ActiveID, ActiveDescription के साथ एक तालिका 'ActiveStatesTable' बनाउंगा और जॉइन निष्पादित करूंगा।

उत्तर

11

मामला बयान पसंद किया जाता है वाक्य रचना:

  • यह एएनएसआई है (92?), तो यह डेटाबेस विक्रेता विशिष्ट विपरीत MySQL, ओरेकल, एसक्यूएल सर्वर, Postgres ... पर समर्थित है वाक्य रचना
  • इसका समर्थन करता है लघु परिसंचरण - मूल्यांकन के बाद मूल्यांकन नहीं किया जाता है
+2

क्या सीएएसई कथन का आकार माना जाना चाहिए? क्या होगा यदि तालिका में 'कॉलम आईडी' कॉलम था, और मानचित्र के 100 विवरण हैं? – galford13x

3

अलग-अलग टेबल करना और जॉइन निश्चित रूप से इस कोड को लिखने का क्लीनर तरीका है। क्या होता है, उदाहरण के लिए, यदि आप एक ही मैपिंग के साथ एक और क्वेरी लिखना चाहते हैं? आपको CASE कथन को नई क्वेरी में कॉपी करना होगा, और नकल की प्रतिलिपि खराब है। यदि आपको एक नई सक्रिय स्थिति जोड़ने की आवश्यकता है तो क्या होगा?

प्रदर्शन के अनुसार, जॉइन और सीएएसई दोनों काफी सस्ते होना चाहिए। मूल्यांकन और कुछ मामलों के शॉर्ट-सर्किटिंग के कारण मामला थोड़ा अधिक प्रदर्शन कर सकता है, लेकिन मेरी राय में, क्लीनर और अधिक लचीला और अधिक एसक्यूएल-आई समाधान है।

+0

यह सच है, लेकिन सीएएसई को बनाए रखना बहुत कठिन नहीं होगा क्योंकि मैं केवल एक दृश्य बना सकता हूं जिसके साथ केस है और फिर दृश्य को बनाए रखें। – galford13x

3

केस बहुत सस्ता होना चाहिए क्योंकि इसमें कोई I/O शामिल नहीं होना चाहिए, लेकिन छोटी सारणी के लिए जॉइन महंगे नहीं हैं (लेकिन इसका परीक्षण करें)।

सवाल यह है कि यदि आपको कई प्रश्नों में इस केस को बनाए रखने की आवश्यकता होगी और आपको इसके लिए कोई रेफरेंसियल अखंडता स्थापित करने की आवश्यकता होगी।

+0

यह सच है, लेकिन सीएएसई को बनाए रखना बहुत कठिन नहीं होगा क्योंकि मैं केवल एक दृश्य बना सकता हूं जिसके साथ केस है और फिर दृश्य को बनाए रखता है। – galford13x

+0

यह छोटी संख्या में मामलों और अपवाद के रूप में आसान हो सकता है, लेकिन इसे अभी भी माना जाना चाहिए। अखंडता को खराब करना, इसे एक दृष्टिकोण में बनाए रखना एक तालिका में इसे बनाए रखने जैसा नहीं है (आप किसी क्वेरी के आधार पर अनुवाद अपडेट नहीं कर सकते हैं)। – Unreason

+0

यह समझ में आता है। मैं एक टेबल जोड़ूंगा और कुछ बेंचमार्क करूंगा। जब मैं समाप्त कर दूंगा तो मैं परिणाम पोस्ट करूंगा। – galford13x

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