2010-09-14 16 views
5

मैं एक दूसरी तालिका से डेटा क्वेरी करने के लिए की जरूरत है, लेकिन केवल तभी प्राथमिक तालिका में स्थिति की एक दुर्लभ सेट पूरा किया जाता है:क्या MySQL शॉर्ट सर्किट IF() फ़ंक्शन है?

SELECT ..., IF(a AND b AND c AND (SELECT 1 FROM tableb ...)) FROM tablea ... 

ए, बी, और सी की स्थिति लगभग हमेशा झूठे हैं, तो मेरी सोच है सबक्वायरी परिणाम सेट में अधिकतर पंक्तियों के लिए कभी निष्पादित नहीं करेगा और इस प्रकार शामिल होने से कहीं अधिक तेज़ होगा। लेकिन यह केवल तभी सच होगा यदि IF() कथन शॉर्ट सर्किट।

क्या यह है?

आपके द्वारा प्रदान की जाने वाली किसी भी मदद के लिए धन्यवाद।

उत्तर

2

जे Jorgenson की मदद से मैं अपने खुद के परीक्षण का मामला के साथ आया था। उनका उदाहरण हालत मूल्यांकन में शॉर्ट सर्किट करने की कोशिश नहीं करता है, लेकिन अपने विचार का उपयोग करके मैं अपने स्वयं के परीक्षण के साथ आया और सत्यापित किया कि MySQL वास्तव में IF() स्थिति जांच को शॉर्ट-सर्किट करता है।

SET @var:=5; 
SELECT IF(1 = 0 AND (@var:=10), 123, @var); #Expected output: 5 
SELECT IF(1 = 1 AND (@var:=10), @var, 123); #Expected output: 10 

दूसरे उदाहरण पर, MySQL ठीक से शॉर्ट सर्किट है: @var मदद जे Jorgenson के लिए 10

करने के लिए सेट हो जाता है कभी नहीं

धन्यवाद!

0

इसे SQL विश्लेषक में आज़माएं। यदि आप सुरक्षित पक्ष में रहना चाहते हैं और डेटाबेस को एक तरह से काम करने के लिए भरोसा नहीं करना है (और नए संस्करणों में कभी भी उस व्यवहार को बदलने के लिए नहीं), तो केवल दो प्रश्न बनाएं और IF प्रोग्रामेटिक रूप से करें।

8

उत्तर हाँ है।
एक mysql क्वेरी के भीतर IF (cond, expr_true, expr_false) संक्षिप्त सर्किट है।

एक परीक्षण यहाँ, @variables का उपयोग कर इस तथ्य को साबित करने के:

SET @var:=5; 
SELECT IF(1 = 0, (@var:[email protected] + 1), @var); -- using ':=' operator to modify 'true' expr @var 
SELECT IF(1 = 1, @var, (@var:[email protected] + 1)); -- using ':=' operator to modify 'false' expr @var 
SELECT @var; 

परिणाम तीनों का चयन करें क्वेरी से '5' है।

यदि IF() फ़ंक्शन छोटा सर्किट नहीं होता है, तो परिणाम SELECT # 1 से '5' होगा, और चयन 6 से '6' और अंतिम "चयन @var" से '7' होगा।

ऐसा इसलिए है क्योंकि 'सही' अभिव्यक्ति को कभी भी निष्पादित नहीं किया गया है, चयन # 1 में और न ही चयनित # 2 के लिए निष्पादित झूठी अभिव्यक्ति है।

नोट करें: '=' ऑपरेटर को एक SQL क्वेरी (चयन, से, और कहां खंडों के भीतर) @var को संशोधित करने के लिए उपयोग किया जाता है। आप इससे कुछ वास्तव में फैंसी/जटिल एसक्यूएल प्राप्त कर सकते हैं। मैंने एक SQL क्वेरी के भीतर 'प्रक्रियात्मक' तर्क लागू करने के लिए @vars का उपयोग किया है।

- जम्मू Jorgenson -

0

यह निर्भर करता है।

नहीं करता है शॉर्ट सर्किट ऐसी है कि वह group_concat साथ काट-छांट चेतावनी से बचने के लिए, उदाहरण के लिए इस्तेमाल किया जा सकता:

set @@group_concat_max_len = 5; 

select if(true or @var:=group_concat('warns if evaluated'), 'actual result', @var); 

परिणाम 'वास्तविक परिणाम' हो जाएगा, लेकिन आप एक चेतावनी मिल जाएगा :

Warning (Code 1260): Row 1 was cut by GROUP_CONCAT() 

जो एक ही चेतावनी आप इस तरह के अलग कुंजी के रूप में कम तुच्छ group_concat भाव, के साथ मिल गया है, और सब पर यदि बिना।

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