2009-05-15 13 views
6

कुछ मैं हाल ही में देखा है, जहां यह एक तरह से अनुचित लगता है में उपयोग करने वाले लोगों है। मुझे लगता है कि मुझे एक चाल याद आ रही है - शायद गति लाभ या कुछ है?जहां एक्स में (5) बनाम जहां एक्स = 5 ... क्यों में प्रयोग करते हैं?

इस क्वेरी:

SELECT * FROM pages WHERE is_visible IN ($visibility) 

कि क्यों करें? नहीं क्यों:

SELECT * FROM pages WHERE is_visible = $visibility 

ज़रूर, अगर यह इस प्रकार थे:

SELECT * FROM pages WHERE is_visible 
IN ($visibility,$invisibility,$somethingelse) 

फिर WHERE x IN (1,2,3)WHERE x = 1 OR x = 2 OR x = 3 के लिए एक बेहतर विकल्प, सही है? लेकिन निश्चित रूप से इस केवल परिदृश्य जहां में इस्तेमाल करना चाहिए है?

वैसे भी आपके समय के लिए धन्यवाद - मैं आपके उत्तरों की प्रतीक्षा करता हूं!

+1

सभी को जवाब देने के लिए धन्यवाद। इस मामले में, $ visiblity भरोसेमंद है और हमेशा 0 या 1।तो यह मुझे लगता है कि "कहां ... IN ..." के इस उपयोग की तरह अनावश्यक है! – ledneb

+1

अब हमेशा हमेशा का मतलब नहीं है। डेवलपर 'बस मामले में' पल के लिए तैयारी कर सकता है। –

+0

यागनी। मामले में मामला कभी नहीं आता है। –

उत्तर

2

यहां कोई चाल प्रदर्शन को बढ़ावा देने के लिए है, लेकिन मुझे नहीं लगता कि किसी भी प्रदर्शन या तो मारा है है। तो दोनों तरीके ठीक हैं। मैं आपसे सहमत हूं कि केवल एक पैरामीटर के साथ एक आईएन क्लॉज का उपयोग मजेदार दिखता है, लेकिन यह अभी भी पालन करने में काफी आसान है।

मुझे लगता है कि ऐसा शायद ऐसा होता है क्योंकि एक डेवलपर सोचता है कि भविष्य में कई मानों की अनुमति है (इस तरह क्वेरी को बदला नहीं जाएगा)। या संभवतः डेवलपर उन परिदृश्यों में उपयोग किया जाता है जहां कई मान संभव हैं, और उन्होंने आदत से इस तरह से लिखा है।

+2

किप मुझे लगता है कि आप गलत हैं। जाहिर है, वह आईएन को पूरी तरह से समझ में नहीं आता है क्योंकि यह OR के समान नहीं है। अगर उसने ऐसा किया तो उसने क्या कहा "फिर जहां x IN (1,2,3) WHERE x = 1 या x = 2 या x = 3 के लिए बेहतर विकल्प है, है ना?" – Lee

+1

धन्यवाद किप। मुझे लगता है कि प्रश्न के सभी जवाब बहुत अच्छे हैं, लेकिन आपका प्रश्न स्वयं ही जवाब देता है :) – ledneb

+0

@Lee: आपकी टिप्पणी आपके उत्तर पर थी, न कि यह, क्योंकि टिप्पणी इस उत्तर से संबंधित नहीं है। – Kip

8

फिर WHERE x IN (1,2,3)WHERE x = 1 OR x = 2 OR x = 3 के लिए बेहतर विकल्प है, है ना? लेकिन निश्चित रूप से यह एकमात्र परिदृश्य है जहां आपको IN का उपयोग करना चाहिए?

नहीं, आप एक सबक्वायरी के साथ भी उपयोग कर सकते हैं।

... जहां (another_table से चुनिंदा क्षेत्र) में क्षेत्र

+0

धन्यवाद, किप। –

+0

यह एक अच्छा मुद्दा है। मैंने नहीं सोचा था कि इन सबक्वायरी – ledneb

5

शायद $ दृश्यता गतिशील रूप से उत्पन्न कर रहा है, इस तरह:

$visibility = implode(', ', array_map('intval', array(1, 2, 3))); 

कहाँ सरणी (1, 2, 3) अविश्वस्त से आ सकती है सूत्रों का कहना है।

9

शायद यह अज्ञात गीला $ दृश्यता एक मूल्य या एकाधिक मानों को संदर्भित करता है? आपके उदाहरण में काफी फिट नहीं है, लेकिन मैंने अन्य स्थानों पर ऐसा उपयोग देखा है।

+2

I के साथ भी इस्तेमाल किया जा सकता है, मैंने इसे देखा है ... स्मृति अभी भी मुझे परेशान करती है। – rmeador

+0

एमएमएम एक अच्छा बिंदु - हालांकि इस मामले में, दृश्यता हमेशा 0 या 1 – ledneb

+0

है यदि $ दृश्यता एकाधिक मानों को संदर्भित करती है, तो उन मानों को एसक्यूएल में कैसे विस्तारित किया जाएगा? यदि $ दृश्यता = '1,2,3' यह अधिक समझ में नहीं आता है: चुनें * पृष्ठों से कहां है ('1,2,3') – ErikE

0

"जहां एक्स (1,2,3)" है, वैसे भी "WHERE x = 1 या x = 2 या x = 3" जैसा ही है।

2

किसी भी प्रकार के सेट ऑपरेशन पर कार्य करता है, जबकि = एक ही मूल्य पर है। तो आप किसी अन्य तालिका, या किसी अन्य प्रकार की डेटा संरचना पर एकाधिक रिकॉर्ड्स के लिए उपयोग कर सकते हैं जो एकाधिक मानों का प्रतिनिधित्व करता है।

3

मुझे लगता है कि क्या करता है यह समझने के लिए मुझे और अधिक लगता है।

आप

SELECT * FROM pages WHERE is_visible = $visibility 

करते हैं ऊपर $ दृश्यता में एक वर होने के लिए इतना = 1 is_visibile, तो अपने एसक्यूएल सभी एकत्र करता है जहां is_visible = 1

कहाँ

SELECT * FROM pages WHERE is_visible IN ($visibility) 
होता

$ दृश्यता होगा @Ionut जी स्टेन की तरह डेटा की एक सरणी सचित्र गया है।

तो अपने कॉल is_visible में कैसा दिखेगा ('1', '2', '3')

तो अब अपने एसक्यूएल सब 1,2 & 3 पंक्तियों एकत्रित करेंगे।

आशा है कि यह समझ में आता है। यह एक बड़ा अंतर है।

+0

मुझे नहीं पता कि यह उनके प्रश्न का उत्तर कैसे देता है। वह वास्तव में क्या मतलब है के बारे में पता है। – Kip

+0

@Lee: आपकी टिप्पणी से आपने गलत जवाब दिया है: >> मुझे लगता है कि आप गलत हैं। जाहिर है, वह आईएन को पूरी तरह से समझ में नहीं आता है क्योंकि यह OR के समान नहीं है। अगर उसने ऐसा किया तो उसने क्या कहा "फिर जहां x IN (1,2,3) WHERE x = 1 या x = 2 या x = 3, सही है?" << तथ्य यह है कि "एक्स IN (1 , 2,3) "* आईएस * प्रभावी रूप से" एक्स = 1 या एक्स = 2 या एक्स = 3 "जैसा ही है। यदि आप कहते हैं कि वे नहीं हैं, तो वे किस परिस्थिति में अलग-अलग प्रश्न परिणाम देंगे? डेटाबेस इंजन के कार्यान्वयन में अंतर हो सकते हैं, लेकिन ब्लैक-बॉक्स परिप्रेक्ष्य में कोई अंतर नहीं है। – Kip

1

नहीं, यह एक चाल नहीं है। दो बयान:

SELECT * FROM pages WHERE is_visible IN ($visibility) 
SELECT * FROM pages WHERE is_visible = $visibility 

लगभग समकक्ष हैं। हम देखते हैं कि दो कथनों तुच्छ मामले में बराबर हैं, उदाहरण के लिए, के 1.

एक मूल्य के साथ एक अदिश जब $visibility है लेकिन बयान गैर तुच्छ मामलों में समान नहीं होते हैं जब $visibility कुछ और होता है । हम दोनों रूपों के व्यवहार में एक महत्वपूर्ण अंतर देख सकते हैं। विचार करें कि प्रत्येक प्रपत्र के साथ होता है जब $visibility इन उदाहरण मान युक्त एक स्ट्रिंग है:

 
    SELECT * FROM pages WHERE is_visible IN (1,2,3) 
    SELECT * FROM pages WHERE is_visible = 1,2,3 
 
    SELECT * FROM pages WHERE is_visible IN (1 OR 1=1) 
    SELECT * FROM pages WHERE is_visible = 1 OR 1=1 

:

 
    '1,2,3' 
    '1 OR 1=1' 
    'select v.val from vals v' 

हम दो रूपों से उत्पन्न परिणामी SQL कथन में एक महत्वपूर्ण अंतर का निरीक्षण

कथन के किसी भी रूप के साथ यहां एक बड़ी चिंता, एसक्यूएल इंजेक्शन की संभावना है। यदि $visibility एक स्केलर मान होने का इरादा है, तो कथन में एक बाइंड वैरिएबल का उपयोग करना एक और अधिक सुरक्षित दृष्टिकोण है, क्योंकि यह किसी को 'अतिरिक्त' एसक्यूएल वाक्यविन्यास को कथन में स्लाइड करने से बचाता है। (बेशक, बाइंड वैरिएबल का उपयोग करने से सभी एसक्यूएल इंजेक्शन को रोका नहीं जाता है, लेकिन यह एक छेद को बंद करने के लिए उपयुक्त दृष्टिकोण है। बाइंड वैरिएबल का उपयोग करके कम से कम कुछ डीबीएमएस प्लेटफार्मों जैसे ओरेकल पर स्केलेबिलिटी में सुधार होगा।)

विचार क्या होता है जब हम एक बाइंड वैरिएबल (प्लेसहोल्डर) का उपयोग करते हैं, जिसे हम जानते हैं एसक्यूएल सिंटैक्स के रूप में व्याख्या किया जाएगा। हम देखते हैं कि दो कथनों वास्तव में कर रहे बराबर:

 
    SELECT * FROM pages WHERE is_visible IN (?) 
    SELECT * FROM pages WHERE is_visible = ? 

बाँध चर के लिए आपूर्ति की किसी भी मूल्य के लिए।

HTH

+0

आपको अभी भी इनके साथ या बराबर के साथ एसक्यूएल इंजेक्शन की संभावना होगी, यह उत्तर प्रश्न के लिए अप्रासंगिक है। – Kip

+0

किप, आप सही हैं। यही वह बात है जिसे मैं इंगित करने की कोशिश कर रहा था। मूल प्रश्न पूछा गया कि क्या वे "कुछ याद कर रहे थे"। ऐसा लगता है कि आप इसे भी याद कर चुके हैं। न तो संस्करण एसक्यूएल इंजेक्शन को रोकता है, जिसे बाइंड वैरिएबल का उपयोग करके आसानी से संबोधित किया जाता है। उस स्थिति में, बयान बराबर होगा, भले ही एक पूर्ण मूल्य प्रदान किया जाए। यदि आप बाइंड वैरिएबल का उपयोग करने से परेशान नहीं होंगे, तो कथन _SIGNIFICANTLY_ अलग-अलग हैं, वे अलग-अलग तरीकों से कमजोर हैं, और हमें कोई भी जानकारी नहीं दी गई है कि $ दृश्यता में क्या शामिल है। मेरा जवाब प्रासंगिक है। – spencer7593

0

फिर जहाँ X में एक बेहतर करने के लिए वैकल्पिक (1,2,3) है, जहां एक्स = 1 या x = 2 या एक्स = 3, है ना? लेकिन निश्चित रूप से यह केवल परिदृश्य है जहां आपको IN का उपयोग करना चाहिए?

IN() और OR वाक्य रचनात्मक रूप से समकक्ष हैं। आपके दो सुझावों के लिए निष्पादन योजना की जांच करना यह दिखाएगा। IN() बस एक अधिक कुशल और आसानी से समझने वाला नोटेशन है।

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