SQL क्‍लॉज में कोई व्यक्ति 1 = 1 और <शर्तों> का उपयोग क्‍यों करेगा?


256

कोई WHERE 1=1 AND <conditions>SQL क्‍लॉज में क्‍यों उपयोग करेगा (या तो एसक्यूएल को कॉन्‍ट्रैनेटेड स्ट्रिंग्स के माध्यम से प्राप्त किया जाता है, या तो परिभाषा देखें)

मैंने कहीं देखा है कि यह SQL इंजेक्शन से बचाने के लिए इस्तेमाल किया जाएगा, लेकिन यह बहुत अजीब लगता है।

यदि इंजेक्शन WHERE 1 = 1 AND injected OR 1=1है तो जैसा परिणाम होगा वैसा ही होगा injected OR 1=1

बाद में संपादित करें: एक दृश्य परिभाषा में उपयोग के बारे में क्या?


आपके उत्तरों के लिए धन्यवाद।

फिर भी, मुझे समझ में नहीं आता कि कोई इस निर्माण का उपयोग किसी दृश्य को परिभाषित करने के लिए क्यों करेगा, या किसी संग्रहीत प्रक्रिया के अंदर इसका उपयोग करेगा।

इसे उदाहरण के लिए लें:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value

3
"कोई इस दृश्य को परिभाषित करने के लिए इस निर्माण का उपयोग क्यों करेगा" संभवतः आदत से बाहर। यह स्थिर प्रश्नों में कोई कार्यात्मक लाभ प्रदान नहीं करता है।
एडीटीसी जूल

जवाबों:


346

यदि परिस्थितियों की सूची संकलन समय पर ज्ञात नहीं है और इसके बजाय रन टाइम पर बनाई गई है, तो आपको इस बारे में चिंता करने की आवश्यकता नहीं है कि आपके पास एक या एक से अधिक स्थितियां हैं। आप उन सभी को उत्पन्न कर सकते हैं जैसे:

and <condition>

और उन सभी को एक साथ मिलाएं। साथ 1=1शुरू में, प्रारंभिक andके साथ संबद्ध करने के लिए कुछ नहीं है।

मैंने इसे किसी भी तरह के इंजेक्शन सुरक्षा के लिए इस्तेमाल नहीं किया है, जैसा कि आप कहते हैं कि ऐसा नहीं लगता कि यह बहुत मदद करेगा। मैं है देखा यह एक कार्यान्वयन सुविधा के रूप में इस्तेमाल किया। SQL क्वेरी इंजन की अनदेखी होगी, 1=1इसलिए इसका कोई प्रदर्शन प्रभाव नहीं होना चाहिए।


34
कभी-कभी आलसी होने के बारे में नहीं है, लेकिन एक क्लीनर कोड है।
एडुआर्डो मोल्टनी

39
अनुगामी ANDs या COMMAs से निपटना गंदा नहीं है ... आपके SQL पर 1 = 1 होने से कुछ भी साफ नहीं होता है।

21
DBAs? यह किस लिए हैं? :)
एडुआर्डो मोल्टनी

38
डीबीए प्रोग्रामर्स के बाद साफ करने के लिए हैं जो सोचते हैं कि वे जानते हैं कि डेटाबेस का प्रभावी ढंग से उपयोग कैसे करें।
एड्रियन प्रैंक

23
"आलसी" मुझे लगता है कि यह स्मार्ट है, आलसी नहीं। आप पुनरावृत्ति कोड और अनावश्यक स्थिति जांच से बच रहे हैं। where 1=1(Oracle) या where true(Postgres) को जोड़ने में सक्षम होने के बिना , मुझे प्रत्येक शर्त की जांच करनी होगी कि क्या यह पहली है। ऐसा करने का कोई मतलब नहीं है, और यह केवल अधिक बॉयलरप्लेट कोड जोड़ता है।
ADTC

113

ग्रेग के उत्तर में एक उदाहरण कोड जोड़ना:

dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1") 

''// From now on you don't have to worry if you must 
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
  sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
  sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if

6
बिट हैक, लेकिन एक वैध उपयोग की तरह लगता है।
माइक

5
यह स्वीकृत उत्तर होना चाहिए। अभ्यास वास्तव में केवल आपके आस-पास हैक होता है, यह निर्धारित करने के लिए नहीं है कि आपके पास कितने सशर्त हैं।
एग्लासमैन

38

मैंने इसका उपयोग तब किया है जब स्थितियों की संख्या परिवर्तनशील हो सकती है।

आप "और" स्ट्रिंग का उपयोग करके शर्तों को संक्षिप्त कर सकते हैं। फिर, आपके द्वारा पास की जाने वाली शर्तों की संख्या गिनने के बजाय, आप अपने स्टॉक SQL स्टेटमेंट के अंत में एक "WHERE 1 = 1" रखें और संक्षिप्त स्थितियों पर फेंक दें।

मूल रूप से, यह आपको शर्तों के लिए एक परीक्षण करने से बचाता है और फिर उनसे पहले "WHERE" स्ट्रिंग जोड़ें।


28

हमेशा की तरह एक आलसी तरीके से जानती है कि आपका WHERE क्लॉज़ पहले से ही परिभाषित है और आपको यह जाँचने के लिए बिना शर्तों को जोड़े रखने देता है कि क्या यह पहला है।


12
"आलसी" मुझे लगता है कि यह स्मार्ट है, आलसी नहीं। आप पुनरावृत्ति कोड और अनावश्यक स्थिति जांच से बच रहे हैं। where 1=1(Oracle) या where true(Postgres) को जोड़ने में सक्षम होने के बिना , मुझे प्रत्येक शर्त की जांच करनी होगी कि क्या यह पहली है। ऐसा करने का कोई मतलब नहीं है, और यह केवल अधिक बॉयलरप्लेट कोड जोड़ता है।
ADTC

2
@ADTC लेखन कोड अक्सर होता है - यदि अधिकतर नहीं - विभिन्न स्थितियों को संभालने के बारे में। यह केवल एक और शर्त है जिसे संभालने की आवश्यकता है, जो मुझे व्यक्तिगत रूप से लगता है कि SQL के साथ उत्पन्न प्रदूषण को आलसी है। यदि आप अपना कोड एक ही स्थान पर 'कहाँ 1 = 1' जोड़ने के लिए आर्किटेक्ट करते हैं, तो आप कर सकते हैं - थोड़े अतिरिक्त प्रयासों के साथ - अपने कोड में उस एक स्थान में शून्य और कई स्थितियों के बीच अंतर को संभालें। मेरा अनुमान हालांकि, 'व्हेयर 1 = 1' के लिए अधिवक्ताओं ने इसे अपने कोडबेस में छिड़का है, जो मुझे इस निष्कर्ष पर पहुंचाता है कि आलस्य नस्लों में आलस्य पैदा करता है।
जेसन एस

@ जैसन लवनेस आविष्कार के जनक हैं।
ADTC

@ADTC मैं आलसी हूं क्योंकि मुझे सैकड़ों स्थानों पर कोड अपडेट करना पसंद नहीं है, इसलिए आविष्कार को एक ही स्थान पर रखा गया है। मुझे WHERE 1=1कई स्थानों पर एक ही कोड को बनाए रखने और अपने सभी उत्पन्न SQL में पढ़ने के लिए अतिरिक्त कार्य करता है। मुझे लगता है मैं तुमसे ज्यादा आलसी हूँ!
जेसन एस

19

अप्रत्यक्ष रूप से प्रासंगिक: जब 1 = 2 का उपयोग किया जाता है:

CREATE TABLE New_table_name 
as 
select * 
FROM Old_table_name 
WHERE 1 = 2;

यह पुरानी तालिका के समान स्कीमा के साथ एक नई तालिका बनाएगा। (यदि आप तुलना के लिए कुछ डेटा लोड करना चाहते हैं तो बहुत आसान है)


3
जोड़ने के लिए भूल गए, जबकि यह पुराने के समान डेटा के साथ एक नई तालिका बनाएगा, नई तालिका में पुरानी मेज से विदेशी कुंजी जैसी अन्य बाधाएं नहीं
होंगी

16

1 = 1 अभिव्यक्ति आमतौर पर उत्पन्न एसक्यूएल कोड में उपयोग किया जाता है। यह अभिव्यक्ति सशर्त बयानों की संख्या को कम करने के लिए sql जनरेटिंग कोड को सरल बना सकती है।


11

दरअसल, मैंने BIRT रिपोर्ट में इस तरह की चीज़ का इस्तेमाल किया है। BIRT रनटाइम के लिए दिया गया क्वेरी फॉर्म का है:

select a,b,c from t where a = ?

और यह '?' ड्रॉप-डाउन बॉक्स से चयनित वास्तविक पैरामीटर मान द्वारा रनटाइम पर प्रतिस्थापित किया जाता है। ड्रॉप-डाउन में विकल्प निम्न द्वारा दिए गए हैं:

select distinct a from t
union all
select '*' from sysibm.sysdummy1

ताकि आपको सभी संभावित मान प्लस " *" मिलें । यदि उपयोगकर्ता *ड्रॉप डाउन बॉक्स से " " का चयन करता है (जिसका अर्थ है कि सभी मानों का चयन किया जाना चाहिए), क्वेरी को रन होने से पहले (जावास्क्रिप्ट द्वारा) संशोधित किया जाना चाहिए।

"के बाद से?" एक स्थितिगत पैरामीटर है और काम करने के लिए अन्य चीजों के लिए ज़रूरी है कि, जावास्क्रिप्ट क्वेरी को संशोधित करता है:

select a,b,c from t where ((a = ?) or (1==1))

यह मूल रूप से जहां अभी भी स्थितीय पैरामीटर छोड़ रहा है, जहां क्लॉज के प्रभाव को हटाता है।

मैंने भी देखा है और आलसी कोडरों द्वारा उपयोग किए जाने वाले मामले को गतिशील रूप से SQL क्वेरी बनाते हुए।

कहते हैं कि आपको गतिशील रूप से एक क्वेरी बनानी होगी जो select * from tचेक और चेक से शुरू होती है :

  • नाम बॉब है; तथा
  • वेतन> $ 20,000 है

कुछ लोग WHERE के साथ पहले जोड़ेंगे और बाद वाले एक और के साथ:

select * from t where name = 'Bob' and salary > 20000

आलसी प्रोग्रामर (और यह अनिवार्य रूप से एक बुरा लक्षण नहीं है) अतिरिक्त स्थितियों के बीच अंतर नहीं करेगा, वे इसके साथ शुरू select * from t where 1=1और बस जोड़ना और उसके बाद क्लॉस करेंगे।

select * from t where 1=1 and name = 'Bob' and salary > 20000

1
"आलसी" मुझे लगता है कि यह स्मार्ट है, आलसी नहीं। आप पुनरावृत्ति कोड और अनावश्यक स्थिति जांच से बच रहे हैं। where 1=1(Oracle) या where true(Postgres) को जोड़ने में सक्षम होने के बिना , मुझे प्रत्येक शर्त की जांच करनी होगी कि क्या यह पहली है। ऐसा करने का कोई मतलब नहीं है, और यह केवल अधिक बॉयलरप्लेट कोड जोड़ता है।
ADTC

1
@ADTC, मेरा मतलब खराब नहीं था। वास्तव में, आलसी प्रोग्रामिंग में एक अच्छा लक्षण है :-) मैं स्पष्ट करूँगा।
paxdiablo

आलस्य सभी बुराई की जड़ है
इवानजिन्हो

11

जब मैं परीक्षण कर रहा हूं या डेटाबेस पर चीजों को दोहरा रहा हूं, तो मुझे यह पैटर्न उपयोगी लगा, इसलिए मैं बहुत जल्दी अन्य शर्तों पर टिप्पणी कर सकता हूं:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
AND Table.Field=Value
AND Table.IsValid=true

में बदल जाता है:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
--AND Table.Field=Value
--AND Table.IsValid=true

10

जहाँ 1 = 0, यह जाँचने के लिए किया जाता है कि क्या तालिका मौजूद है। पता नहीं क्यों 1 = 1 का उपयोग किया जाता है।


1
यह देखा गया कि डेटाबेस से एक खाली परिणाम वापस करने के लिए नए रिकॉर्ड के लिए एक धारक के रूप में इस्तेमाल किया जाएगा।
गैरी किंडेल

6

जबकि मैं देख सकता हूं कि 1 = 1 उत्पन्न एसक्यूएल के लिए उपयोगी होगा, पीएचपी में मैं जिस तकनीक का उपयोग करता हूं वह क्लॉज का एक सरणी बनाना है और फिर करना है

implode (" AND ", $clauses);

इस प्रकार एक अग्रणी या अनुगामी होने की समस्या से बचने और। जाहिर है कि यह केवल उपयोगी है यदि आप जानते हैं कि आप कम से कम एक खंड होने जा रहे हैं!


1
यहीं 1 = 1 आता है। यह आपको "कम से कम एक क्लॉज" देता है, इसलिए आपको "एंड एबीसी" पर सिर्फ थप्पड़ मारने की चिंता नहीं करनी चाहिए
कार्ल

मुझे यह विचार पसंद है! अधिक पूर्ण उदाहरण के लिए यहां देखें stackoverflow.com/questions/35326160/…
drooh

5

यहां एक निकट से संबंधित उदाहरण है: MERGEस्रोत तालिका से सभी मानों का उपयोग करते हुए लक्ष्य को अपडेट करने के लिए एक एसक्यूएल स्टेटमेंट का उपयोग करना जहां कोई सामान्य विशेषता नहीं है, जिस पर जैसे शामिल होने के लिए

MERGE INTO Circles
   USING 
      (
        SELECT pi
         FROM Constants
      ) AS SourceTable
   ON 1 = 1
WHEN MATCHED THEN 
  UPDATE
     SET circumference = 2 * SourceTable.pi * radius;

5

कोई क्यों 1 = 1 और का उपयोग करेगा <proper conditions>

मैं गया है देखा पहनें चौखटे इस (तरह सामान करना लाल ,) इस आलसी पार्स प्रथाओं दोनों के लिए लागू किया जा करने के लिए अनुमति देता है WHEREऔर ANDSql कीवर्ड।

उदाहरण के लिए (मैं यहां एक उदाहरण के रूप में C # का उपयोग कर रहा हूं), Sll क्वेरी में निम्नलिखित विधेय की सशर्त पार्सिंग पर विचार करें string builder:

var sqlQuery = "SELECT * FROM FOOS WHERE 1 = 1"
if (shouldFilterForBars)
{
    sqlQuery = sqlQuery + " AND Bars > 3";
}
if (shouldFilterForBaz)
{
    sqlQuery = sqlQuery + " AND Baz < 12";
}

"लाभ" का WHERE 1 = 1अर्थ है कि किसी विशेष कोड की आवश्यकता नहीं है:

  • के लिए और - चाहे शून्य, एक या दोनों विधेय (बार्स और बाज की), लागू किया जाना चाहिए निर्धारित करेंगे जो पहले चाहे ANDआवश्यक है। चूंकि हमारे पास पहले से ही कम से कम एक विधेय है 1 = 1, इसका मतलब है ANDकि हमेशा ठीक है।
  • किसी भी तरह की भविष्यवाणी नहीं करने के लिए - उस स्थिति में जहां शून्य की भविष्यवाणी की जाती है, तब WHEREगिरा दिया जाना चाहिए। लेकिन फिर से, हम आलसी हो सकते हैं, क्योंकि हम फिर से कम से कम एक विधेय की गारंटी देते हैं।

यह स्पष्ट रूप से एक बुरा विचार है और इस तरह से वैकल्पिक और सशर्त विधेय को पार्स करने के लिए एक स्थापित डेटा एक्सेस फ्रेमवर्क या ओआरएम का उपयोग करने की सिफारिश करेगा ।


या अगर अपना खुद का रोल करना, जहां आपके कोड में क्लॉज बिल्डर एक जगह पर होना चाहिए। फिर आप अपने कोड में एक ही स्थान पर शून्य predicates या शून्य से अधिक predicates संभाल सकते हैं। मेरा संदेह यह है कि इसका अस्तित्व WHERE 1=1एक निष्पक्ष संकेतक है जो कि ऐसा नहीं है, कि कोड आधार स्ट्रिंग्स के बिट्स से अटे पड़े हैं WHERE 1=1, जो मुझे एक एप्लिकेशन आर्किटेक्चर समस्या का संकेत देगा, और मुझे लगता है कि केवल एक ही नहीं होगा!
जेसन एस

1
वास्तव में विचार के बारे में "बुरा" कुछ भी नहीं है, बहुत कम "स्पष्ट" गलती है। न ही एक ओआरएम सभी मामलों में उचित तरीका है। SQL और रिलेशनल बीजगणित लोगों को जानें ...
Hejazzman

4

यदि आप यहां खोज रहे हैं WHERE 1, तो ध्यान दें WHERE 1और WHERE 1=1समान हैं। WHERE 1शायद ही कभी इस्तेमाल किया जाता है क्योंकि कुछ डेटाबेस सिस्टम इसे WHERE 1वास्तव में बूलियन नहीं मानते हुए अस्वीकार करते हैं ।


2

यह उस मामले में उपयोगी है, जिसमें आपको डायनेमिक क्वेरी का उपयोग करना होता है जिसमें क्लॉज़ में आपको कुछ फ़िल्टर विकल्पों को जोड़ना होता है। जैसे यदि आप विकल्प शामिल करते हैं तो स्थिति के लिए 0 निष्क्रिय है, सक्रिय के लिए 1 है। विकल्पों के आधार पर, केवल दो उपलब्ध विकल्प (0 और 1) हैं, लेकिन यदि आप सभी रिकॉर्ड प्रदर्शित करना चाहते हैं, तो यह करीब 1 = 1 को शामिल करना आसान है। नीचे देखें नमूना:

Declare @SearchValue    varchar(8) 
Declare @SQLQuery varchar(max) = '
Select [FirstName]
    ,[LastName]
    ,[MiddleName]
    ,[BirthDate]
,Case
    when [Status] = 0 then ''Inactive''
    when [Status] = 1 then ''Active''
end as [Status]'

Declare @SearchOption nvarchar(100)
If (@SearchValue = 'Active')
Begin
    Set @SearchOption = ' Where a.[Status] = 1'
End

If (@SearchValue = 'Inactive')
Begin
    Set @SearchOption = ' Where a.[Status] = 0'
End

If (@SearchValue = 'All')
Begin
    Set @SearchOption = ' Where 1=1'
End

Set @SQLQuery = @SQLQuery + @SearchOption

Exec(@SQLQuery);

2

सभी उत्तरों की समीक्षा करने के बाद मैंने कुछ प्रयोग करने का निर्णय लिया

SELECT
*
FROM MyTable

WHERE 1=1

फिर मैंने अन्य नंबरों से जांच की

WHERE 2=2
WHERE 10=10
WHERE 99=99

ect के सभी चेक किए गए, क्वेरी रन टाउन समान है। जहां क्लॉज के बिना भी। मैं वाक्य रचना का प्रशंसक नहीं हूं


1

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

कुछ इस तरह

select column1, column2 from my table where 1=1 {name} {age};

फिर हम इस तरह के क्लॉज का निर्माण करेंगे और इसे पैरामीटर मान के रूप में पास करेंगे

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

चूंकि रन-वे पर क्लॉज का चयन हमारे लिए अज्ञात है, इसलिए इससे हमें यह पता लगाने में बहुत मदद मिलती है कि क्या इसमें शामिल हैं 'AND' or 'WHERE'.


0

1=1इंडेक्स की तरह एक विधेय का उपयोग करना एक सामान्य संकेत है जिसका उपयोग कभी-कभी एक अनुक्रमणिका स्कैन का उपयोग करने या न करने के लिए पहुंच योजना को मजबूर करने के लिए किया जाता है। जब आप मल्टी-नेस्टेड क्वेरी का उपयोग कर रहे हैं, तो इसका उपयोग कई कारणों के साथ किया जाता है, जहां क्लॉज जहां कभी-कभी सभी इंडेक्स का उपयोग करते हुए भी एक्सेस प्लान का उपयोग करते हुए प्रत्येक टेबल को पढ़ने के लिए होता है - एक पूर्ण टेबल स्कैन। यह डीबीए द्वारा उपयोग किए जाने वाले कई संकेतों में से केवल 1 है जो एक अधिक कुशल पथ का उपयोग करके dbms को धोखा देने के लिए है। बस एक को अंदर मत फेंको; आपको क्वेरी का विश्लेषण करने के लिए dba की आवश्यकता है क्योंकि यह हमेशा काम नहीं करता है।


4
क्या आपके पास कोई उद्धरण है जो कुछ डेटाबेस के लिए इस व्यवहार का दस्तावेज है?
जो

0

यहाँ एक उपयोग का मामला है ... हालाँकि मैं इस बात से बहुत ज्यादा चिंतित नहीं हूँ कि मुझे 1 = 1 का उपयोग क्यों करना चाहिए या नहीं करना चाहिए। मैं SQL सर्वर से कुछ डेटा को पुनः प्राप्त करने के लिए pyodbc का उपयोग करके एक फ़ंक्शन लिख रहा हूं। मैं whereअपने कोड में कीवर्ड के बाद किसी भरण-पोषण के लिए बाध्य करने के तरीके की तलाश कर रहा था । यह वास्तव में एक बढ़िया सुझाव था:

if _where == '': _where = '1=1'
...
...
...
cur.execute(f'select {predicate} from {table_name} where {_where}')

इसका कारण यह है कि मैं 'जहां' शब्द को एक साथ लागू नहीं कर सकता था, जहां _ क्लॉज चर के अंदर एक साथ था। इसलिए, मुझे लगता है कि किसी भी डमी स्थिति का उपयोग करना जो सही का मूल्यांकन करता है एक भराव के रूप में करता है।


-1

मैं पहली बार ADO और क्लासिक एस्प के साथ इस पर वापस आया, मुझे जो उत्तर मिला वह था: प्रदर्शन। अगर आप एक सीधा करते हैं

Select * from tablename

और पास करें कि एक sql कमांड / टेक्स्ट के रूप में आपको इसके साथ ध्यान देने योग्य प्रदर्शन में वृद्धि होगी

Where 1=1

जोड़ा, यह एक दृश्य अंतर था। टेबल हेडर के साथ कुछ करने के लिए जैसे ही पहली शर्त पूरी की जाती है, या किसी अन्य पागलपन से लौटा जाता है, वैसे भी, इसने चीजों को गति दी।


3
अगर यह सच है, तो DBMS हमेशा इसे क्यों नहीं जोड़ता है?
कार्मेकेनो

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