WHERE 1 या WHERE 1 = 1 का उपयोग क्यों करें?


50

आमतौर पर, यदि हमारे क्वेरी स्टेटमेंट में शर्तों की आवश्यकता नहीं होती है, तो हम एक WHEREक्लॉज का उपयोग नहीं करते हैं । लेकिन मुझे लगता है WHERE 1कि कई जगहों पर एक क्लॉज का इस्तेमाल किया जा रहा है, यहां तक ​​कि जहां अन्य शर्तें मौजूद नहीं हैं।

  • ऐसा क्यों किया जाता है?
  • क्या निष्पादन के समय के लिए विशिष्ट लाभ हैं?
  • क्या यह अन्य कार्यक्षमताओं को सक्षम करता है?
  • क्या उपयोग WHERE 1=1इसके समान है?

जवाबों:


42

मूल रूप से यह सिर्फ प्रोग्रामर की सुविधा के लिए है क्योंकि आप इसके साथ सिर्फ अतिरिक्त शर्तें जोड़ सकते हैं AND...और इसका निष्पादन समय पर कोई प्रभाव नहीं पड़ता है।

Stackoverflow के लिए इन लिंक की जाँच करें:

ध्यान दें कि WHERE 1इसके समान है WHERE 1=1; दोनों का मतलब है, WHERE TRUEलेकिन पूर्व को कई डेटाबेस प्रबंधन प्रणालियों द्वारा खारिज कर दिया गया है क्योंकि वास्तव में बूलियन नहीं है।


15

मेरा मुख्य उपयोग यह है कि प्रश्नों के विकास के दौरान सामान पर टिप्पणी करना आसान बनाता है। मैं के साथ नेतृत्व ,की और andकी:

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

इसके अलावा कार्यक्रम को अंत तक सामान से निपटना आसान बनाता है।

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

अन्यथा आपको पहला विकल्प क्वालिफाई करना होगा ... और प्रत्येक निम्न विकल्प में पिछले विकल्पों की जांच करनी होगी। क्या होगा यदि उपयोगकर्ता ने पिछले उदाहरण में केवल विकल्प डी को चुना? आपको यह सुनिश्चित करना होगा कि if A, B and C aren't chosenफिर WHEREअन्य उपयोग करें and। साथ =शुरू में, तुम बस बयान के अंत में क्वालिफायर तमाचा कर सकते हैं।


1
और आपने उस कोड को 1980 की तरह ऑब्जेक्ट ओरिएंटेशन के बिना एक भाषा में लिखा है, क्या किसी को ऑब्जेक्ट आधारित एसक्यूएल जनरेटर के विचार के साथ आया है?
टॉमटॉम

मैं codeSSMS के पहले ब्लॉक या समान क्वेरी टूल्स के समान लिखता हूं । डेटा सेट पर शोध करना और अंतिम उपयोगकर्ताओं के लिए रिपोर्टिंग टूल (जैसे क्रिस्टल रिपोर्ट) में डालने से पहले सही परिणाम प्राप्त करना। दूसरा ब्लॉक वह है जो मैंने अन्य लोगों को करते देखा है, क्योंकि मेरा काम कच्चे sql पहुँच के बारे में बहुत अधिक नहीं है। मैंने अन्य लोगों के समान कोड का निवारण किया है और तर्क को समझ सकता हूं। (कोड VB, C # और PHP में था)।
वर्नरसीडी

10

हम ऐसा क्यों करते हैं?

डायनेमिक कोड जेनरेशन, जो सक्षम प्रोग्रामरों द्वारा नहीं लिखा गया है, मेरे दिमाग में आता है।

चयन करता है .... जहां और फिर आपके पास समथिंग होना आवश्यक है .... इसलिए केवल आवश्यकता पड़ने पर WHERE को जोड़ने के बजाय, वे गैर-सीमित स्थिति जोड़ते हैं जब कोई नहीं होता है। देखा कि - "विशेषज्ञ" फायरिंग के लिए जिम्मेदार।

या आदमी सिर्फ बातें कहाँ है अनिवार्य है;)

और कुछ भी मैं देखने में विफल हूं।


5

मैं PostgreSQL के लिए C ++ / C में उपयोगकर्ता परिभाषित कार्यों का एक गुच्छा प्रोग्रामिंग कर रहा था जो कि एक बड़ी कंपनी (10K + लोग) में अन्य लोगों द्वारा उपयोग किया जाता था। मेरे कार्यों का एक वैकल्पिक whereपैरामीटर है: यदि कोई मूल्य नहीं दिया गया था, तो क्लॉज का उपयोग नहीं किया गया था। यह स्पष्ट रूप से प्रलेखित था। दुर्भाग्य से, किसी ने भी इस सुविधा का उपयोग नहीं किया और हर कोई जहां सिर्फ where 1=1क्लॉज की आपूर्ति कर रहा था । सैद्धांतिक रूप से यह नासमझी लगती है, व्यावहारिक रूप से सभी क्वेरी ऑप्टिमाइज़र इस प्रकार के बयानों को नियंत्रित करते हैं। और 10K लोगों को शिक्षित करना मुश्किल है।


3
कभी किसी ने आपका UDF नहीं बुलाया WHERE 1=1; DROP TABLE CUSTOMERS?
ट्विंकल्स

फिर भी, मैं कहां 1 क्लॉज का उपयोग करने के पीछे की अवधारणाओं को खोजने में सक्षम नहीं हूं। अधिक स्पष्टीकरण की आवश्यकता है? जैसा कि मुझे निष्पादन समय में कोई सुधार नहीं मिला।
ursitesion

यह निष्पादन समय के साथ बहुत कम है। यह संस्कृति के साथ टूडू है कि लोग कैसे प्रोग्राम करते हैं। ऐसा कभी-कभी होता है कि आपका कोड (आईटी लोगों द्वारा प्रोग्राम किया गया) इंजीनियरों द्वारा उपयोग किया जाता है। इन लोगों के पास अपने कोड को सोचने और आह्वान करने का अपना तरीका है
arthur

@Twinkles: यह निश्चित रूप से एक दिलचस्प मुद्दा है। नोट करने के लिए यहां कुछ बिंदु हैं। (i) डेटाबेस UDF (ii) के लिए आसानी से पढ़ा जाता है। मेरा काम चीजों के एक समूह द्वारा कुछ टेबल समूहों में शामिल होने और चीजों को खराब करने के लिए डेटा वेयरहाउसिंग विंडो के कार्यों का उपयोग करने के लिए करता है। यह कुछ भी गिराने के लिए चुनौतीपूर्ण है, हालांकि असंभव नहीं है, (iii) यूडीएफ पूर्व-उत्पादन कोड के लिए हैं। जिसका अर्थ है कि यह कभी भी उत्पादन में नहीं आता है: यदि फ़ंक्शन चुनौती से बचता है तो एक और विभाग पूरी तरह से हमारे द्वारा लिखी गई हर चीज को फिर से लिखता है
arthur

4
वास्तव में 10,000 लोगों को शिक्षित करना बहुत आसान है। जब वे इसे गलत करते हैं तो एप्लिकेशन को विफल कर दें। वे तुरंत गलत करना बंद कर देंगे।
चमेली

2

"जहाँ 1 = 1" का उपयोग गतिशील वर्ग में आवश्यक कोड की जटिलता को कम करता है जहां 'क्लॉज जनरेशन' होता है। अन्यथा, 'जहां' क्लॉज बनाते समय आपको यह जांचना होगा कि क्या प्रत्येक घटक के लिए यह पहला घटक है। कोड जटिलता को कम करने और कोड की जटिलता को कम करने के लिए यह एक सरल कोड पैटर्न है, जहां संभव है, लगभग हमेशा सही निर्णय होता है।


0

यहां आप जाते हैं ... प्रोग्रामिंग के दृष्टिकोण से 1 = 1 का एक उपयोग ...यहाँ छवि विवरण दर्ज करें

इस तरह की स्थिति में जब मुझे रन टाइम पर एक क्वेरी बनाने की आवश्यकता होती है और यह छोटा या लंबा हो सकता है, मैं 'जहां 1 = 1 और' का उपयोग करता हूं

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

चीजों को आसान बनाएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.