2009-08-12 17 views
8

संभावित डुप्लिकेट:
Why would a sql query have “where 1 = 1”
Why would someone use WHERE 1=1 AND <conditions> in a SQL clause?SQL कथन में WHERE 1 = 1 का उपयोग करने का उद्देश्य क्या है?

मैंने देखा है कि विभिन्न क्वेरी उदाहरण में एक बहुत है और यह शायद सभी एसक्यूएल इंजन के लिए चला जाता है है।

यदि कोई ऐसी क्वेरी है जिसमें परिभाषित लोगों की कोई शर्त नहीं है (और विशेष रूप से ओआरएम ढांचे) अक्सर हमेशा-सही स्थिति WHERE 1 = 1 या ऐसा कुछ जोड़ते हैं।

तो बजाय

SELECT id, name FROM users; 

वे

SELECT id, name FROM users WHERE 1 = 1; 

केवल संभावित कारण मैं तुम्हें स्थिति जोड़ रहे हैं, तो के बारे में सोच सकता है गतिशील रूप से आप प्रारंभिक AND अलग करना बारे में चिंता करने की जरूरत नहीं है का उपयोग करें, लेकिन प्रश्न में वास्तविक स्थिति होने पर अभी भी यह 1 = 1 स्थिति पट्टी हो जाती है।

CakePHP से

वास्तविक उदाहरण (ढांचे द्वारा उत्पन्न):

(कोई शर्त)

SELECT `User`.`id`, `User`.`login` 
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC; 
(शर्त के साथ)

SELECT `User`.`id`, `User`.`login` 
FROM `users` AS `User` 
WHERE `User`.`login` = '[email protected]' 
LIMIT 1; 

वहाँ कि अतिरिक्त शर्त जोड़ने के लिए किसी भी कारण है?

+1

http://stackoverflow.com/questions/517107/why-would-a-sql-query-have-where-1-1 के बीच डुप्पी –

उत्तर

4

हाँ, आमतौर पर यह विफल होने के लिए बल देने के लिए 'जहां 1 = 0' के रूप में शुरू होता है।

यह एक लेनदेन में इसे लपेटने का एक और बेवकूफ तरीका है और अंत में इसे आपकी क्वेरी का परीक्षण करने के लिए नहीं कर रहा है। (यह पसंदीदा तरीका है)।

+0

एक से अधिक उत्तरों हो सकते हैं; और इस मामले में ओपी विशिष्ट था कि यह केवल गतिशील प्रश्नों के निर्माण के लिए नहीं था (और ईमानदारी से, यदि आप ओआरएम के इन दिनों में गतिशील प्रश्न बना रहे हैं, तो अपने आप को अच्छी तरह से देखें)। –

2

1 = 1 का उपयोग वास्तव में एक बहुत अच्छा विचार नहीं है क्योंकि इससे पूर्ण तालिका स्कैन हो सकती है। >T-SQL 1=1 Performance Hit

+1

केवल डीबीएमएस के सबसे क्रांतिकारी पर। – paxdiablo

+1

आपके द्वारा लिंक किए गए प्रश्न में सभी उत्तर 1 = 1 से कोई प्रभाव नहीं पड़ता है। – Ryan

13

यह भी एक आम बात है, जब लोग एसक्यूएल क्वेरी प्रोग्राम के रूप में निर्माण हैं, यह सिर्फ आसान है 'जहां 1 = 1' और फिर जोड़कर 'और customer.id साथ शुरू करने के लिए -

इस देखें =: custId 'निर्भर करता है कि कोई ग्राहक आईडी प्रदान की जाती है या नहीं। तो आप हमेशा 'और ...' से शुरू होने वाले क्वेरी के अगले भाग को जोड़ सकते हैं।

+1

-1 यह सवाल दोहरा रहा है, जो कहता है "आपको प्रारंभिक और" – Andomar

1

जैसा कि आपने कहा:

अगर आप की स्थिति जोड़ रहे हैं गतिशील रूप से आप प्रारंभिक और है कि एकमात्र कारण हो सकता है अलग करना के बारे में में चिंता करने की जरूरत नहीं है , आप सही हैं।

4

1 = 1 हमेशा सभी RDBMS द्वारा नजरअंदाज कर दिया जाता है।के साथ एक क्वेरी निष्पादित करने वाला कोई ट्रेडऑफ़ नहीं है, जहां 1 = 1 है।

ORM चौखटे या अन्य तरह गतिशील जहां की स्थिति, भवन बहुत बार करते हैं, यह संलग्न करने के लिए आसान है असली जहां की स्थिति है क्योंकि आप एक और prepending वर्तमान हालत के लिए के लिए जाँच से बचें।

stmt += "WHERE 1=1"; 
if (v != null) { 
    stmt += (" AND col = " + v.ToString()); 
} 

यह 1 = 1 के बिना ऐसा लगता है।

var firstCondition = true; 
... 
if (v != null) { 
    if (!firstCondition) { 
     stmt += " AND "; 
    } 
    else { 
     stmt += " WHERE "; 
     firstCondition = false; 
    } 
    stmt += "col = " + v.ToString()); 
} 
+1

वास्तव में अलग करने की चिंता करने की ज़रूरत नहीं है, असल में, मैं ऐसा कुछ करता हूं जैसे: cmd = "select ..."; sep = "where"; foreach (cond) {cmd + = sep + cond; sep = "और"; } – paxdiablo

+0

जो * थोड़ा * क्लीनर दिखता है। – paxdiablo

+0

अच्छा विचार! मैं इसे आगे प्रोग्रामिंग के लिए ध्यान में रखता हूं। – Christian13467

3

लोग इसका उपयोग करते हैं क्योंकि गतिशील एसक्यूएल प्रश्नों का निर्माण करते समय वे स्वाभाविक रूप से आलसी होते हैं। यदि आप "where 1 = 1" से शुरू करते हैं तो आपके सभी अतिरिक्त क्लॉज बस "and" से शुरू होते हैं और आपको पता लगाना नहीं पड़ता है।

यह नहीं कि स्वाभाविक रूप से आलसी होने के साथ कुछ भी गलत है। मैंने दोगुनी-लिंक्ड सूचियों को देखा है जहां एक "खाली" सूची में दो सेंटीनेल नोड होते हैं और आप पर last->prev सहित प्रोसेसिंग शुरू करते हैं।

यह वास्तव में first और last नोड्स को हटाने के लिए सभी विशेष हैंडलिंग कोड हटा दिया। इस सेट-अप में, प्रत्येक नोड एक मध्य नोड था क्योंकि आप first या last को हटाने में सक्षम नहीं थे। दो नोड्स बर्बाद हो गए थे लेकिन कोड तेज था और (कभी इतना थोड़ा) तेज था।

एकमात्र अन्य जगह जिसे मैंने कभी देखा है "1 = 1" निर्माण बीआईआरटी में है। रिपोर्ट अक्सर पोजीशनल पैरामीटर का उपयोग करती हैं और सभी मानों को अनुमति देने के लिए जावास्क्रिप्ट के साथ संशोधित की जाती हैं। तो क्वेरी:

select * from tbl where ((col = ?) or (1 = 1)) 

इस नई क्वेरी स्थितीय पैरामीटर के साथ लगभग नगण्य बिना इस्तेमाल किया जा करने की अनुमति देता है:

select * from tbl where col = ? 

उपयोगकर्ता का चयन करता है जब पैरामीटर के लिए "*"col के लिए इस्तेमाल किया जा रहा पढ़ने के लिए संशोधित किया गया है विवरण। अभी भी एक ऐसा पैरामीटर अभी भी है। कोई भी सभ्य डीबीएमएस (उदा।, डीबी 2/जेड) निष्पादन योजना बनाने की कोशिश करने से पहले पूरी तरह से खंड को हटाने के लिए उस क्वेरी को अनुकूलित करेगा, इसलिए कोई व्यापार-बंद नहीं है।

+0

धन्यवाद दोस्त! यह सबसे व्यावहारिक जवाब था! –

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