2009-07-01 9 views
5

मैं ऐसे क्लाइंट के साथ काम कर रहा हूं जो ओरेकल में लगभग 1=1 के साथ अपने सभी WHERE खंडों को शुरू करता है। मेरी अज्ञानता को क्षमा करें, लेकिन क्या यह नो-ऑप नहीं है? क्या इस उपयोग के कोई नकारात्मक परिणाम हैं?ओरेकल में, एसक्यूएल क्वेरी का WHERE क्लॉज 1 = 1 उपयोगी के साथ शुरू कर रहा है?

यहाँ एक झाड़ी उदाहरण है:

SELECT gpz.zname 
     ,gpp.pname 
FROM  table1 gpp INNER JOIN table2 gpz ON gpz.p_id = gpp.p_id 
WHERE 1=1 
     AND gpp.active = 1 
     AND gpz.active = 1 

उत्तर

18

यह गतिशील एसक्यूएल पीढ़ी को आसान बनाने के पूर्ण हो जाएगा। मूल रूप से प्रत्येक शर्त (यह द्वारा WHERE नहीं AND पहले है) विशेष रूप पहली शर्त के इलाज या यहां तक ​​कि चिंता अगर वहाँ एक WHERE खंड बिल्कुल होना चाहिए बिना AND <condition> के रूप में जोड़ा जा सकता है।

तो बस इसे बट्टे खाते में उपयोग की आसान या यकीनन, आलस्य के रूप में।

+1

आलस्य के लिए +1, एक या दो पंक्तियों द्वारा PL/SQL सरल बनाने और डेटाबेस पर इस तरह के एसक्यूएल को inflicting बहुत खराब है। बहुत बुरा अगर किसी कारण से उन्हें कर्सर_शियरिंग = फोर्स सेट करने की आवश्यकता है - सुनिश्चित नहीं है लेकिन मुझे लगता है कि सीबीओ को तब "WHERE: 1 =: 2 और ..." के साथ सामना करना होगा और तदनुसार इसे अनुकूलित करें! पता लगाने के लिए दिलचस्प हो ... –

+0

मुझे इस मामले में संदेह था। इस क्लाइंट में वास्तव में इस तरह के गतिशील प्रश्न भी हैं। वे वास्तव में आलसी हैं :) – Blanthor

+0

@ जेफरीकेम्प [टी-एसक्यूएल 1 = 1 प्रदर्शन हिट] (http://stackoverflow.com/q/1049512) के अनुसार, डीबीएमएस इस पैटर्न का उपयोग करके प्रदर्शन हिट नहीं लेता है। –

0

वे सबस्ट्रिंग से क्वेरी का निर्माण किया है हो सकता है।

व्यापार नियम मिलान के आधार पर इसे AND एस के साथ बनाने का एक तरीका हो सकता है, इसलिए आपको वास्तव में देखभाल करने की ज़रूरत नहीं है कि आपकी पहली शर्त कौन है।

इसे उस तरह से अपने आप को नहीं मारूंगा।

3

वे गतिशील क्वेरी का निर्माण कर रहे हैं, तो आप क्या वे बाँध चर का उपयोग कर रहे जांच होनी चाहिए। अक्षर से क्वेरी बनाने के लिए अतिरिक्त पार्सिंग की आवश्यकता होती है, संभावित रूप से सीमित स्केलेबिलिटी की आवश्यकता होती है, और एसक्यूएल इंजेक्शन हमलों के जोखिम में भी काफी वृद्धि हो सकती है।

where 1 = 1 and my_id = :b1; 

(और फिर बाँध चर के मूल्य को परिभाषित) आम तौर पर किया जाता है की तुलना में बेहतर:

where 1 = 1 and my_id = 123456; 
संबंधित मुद्दे