क्या मुझे T-SQL में बराबर नहीं के लिए =! या <> का उपयोग करना चाहिए?


800

मैंने देखा है SQLकि दोनों का उपयोग करता है !=और समान नहीं के<> लिए । पसंदीदा वाक्यविन्यास क्या है और क्यों?

मुझे पसंद है !=, क्योंकि <>मुझे याद दिलाता है Visual Basic


5
इसे भी देखें: stackoverflow.com/questions/7884/…
दीना

कोड की पोर्टेबिलिटी। यदि आपकी आवश्यकताओं को एएनएसआई एसक्यूएल आसानी से पूरा करता है, तो इसका उपयोग करना बेहतर है। आप सभी DB में समान कोड का उपयोग कर सकते हैं। उदाहरण के लिए। एक SQL पुस्तक लेखक जो नमूना कोड का उपयोग करके मूल SQL को चित्रित करना चाहता है।
भाप से

1
मैं एक उदाहरण जोड़ना चाहता हूं जहां केवल ANSI SQL कोड होने से समस्या हो सकती है - मानक SQL विकल्पों को कैसे नियंत्रित करता है NULLS FIRST और NULLS LAST का समर्थन करता है कि NULLs कैसे सॉर्ट करता है, लेकिन T-SQL इस विकल्प का समर्थन नहीं करता है।
स्टीम

फिर से खोलने की कोई जरूरत नहीं है। चिह्नित सवाल है, एक नकली, बस अभी तक एक और विकल्प के लिए बढ़ा दी है NOT (A = B)
तिलामा

@Steam, आपको यह निर्दिष्ट करना चाहिए कि एएनसी एसक्यूएल के किस वर्ष के संस्करण को आप संदर्भित कर रहे हैं। इनमें से कुछ वर्जन के लिए आपको लेवल कॉम्पैटिबिलिटी या सीक्रेड के सटीक हिस्सों को निर्दिष्ट करने की आवश्यकता होती है। उनमें से किसने NULLS FIRST और NULLS LAST की शुरुआत की?
घुमर

जवाबों:


539

यदि आप SQL Server AKA T-SQL का उपयोग कर रहे हैं, तो तकनीकी रूप से वे समान कार्य करते हैं। यदि आप इसे संग्रहीत कार्यविधियों में उपयोग कर रहे हैं तो एक के बाद एक उपयोग करने का कोई कारण नहीं है। यह तब व्यक्तिगत वरीयता में आता है। मैं <> का उपयोग करना पसंद करता हूं क्योंकि यह एएनएसआई अनुरूप है।

आप विभिन्न ANSI मानकों के लिंक पा सकते हैं ...

http://en.wikipedia.org/wiki/SQL


41
मैंने हमेशा !=सी-प्रभावित भाषा में अपने अस्तित्व के कारण इसका उपयोग करना पसंद किया था, और क्योंकि पायथन डॉक्यूमेंटेशन कहता है: "फॉर्म <>और !=सी के बराबर हैं; सी के साथ संगतता के लिए !=पसंद किया जाता है; जहां !=नीचे उल्लेख किया गया <>है, वह भी स्वीकार किया जाता है। <>वर्तनी अप्रचलित माना जाता है। " लेकिन SQL पायथन नहीं है!
इयान सैमुअल मैकलीन एल्डर

24
मुझे <> का उपयोग करना पसंद है क्योंकि यह मुझे XML की याद दिलाता है। लेकिन SQL XML नहीं है!
रोब ग्रांट

32
हाँ; Microsoft स्वयं को ANSI अनुपालन के लिए विशेष रूप <>से उपयोग करने की सलाह देता है !=, उदाहरण के लिए 70-461 परीक्षा के लिए Microsoft प्रेस प्रशिक्षण किट में, "Microsoft SQL सर्वर को छोड़ते हुए", वे कहते हैं "मानक रूप का चयन करने के उदाहरण के रूप में, T-SQL दो का समर्थन करता है" नहीं "ऑपरेटरों के बराबर: <> और! = पूर्व मानक है और बाद वाला नहीं है। यह मामला एक बड़प्पन होना चाहिए: मानक एक के लिए जाओ!"
मैट गिब्सन

10
मुझे <> पसंद है क्योंकि यह टाइप करना आसान है।
user2023861

731

अधिकांश डेटाबेस !=(लोकप्रिय प्रोग्रामिंग भाषाओं) और <>(ANSI) का समर्थन करते हैं ।

डेटाबेस जो दोनों का समर्थन करते हैं !=और <>:

एएनएसआई मानक ऑपरेटर का समर्थन करने वाले डेटाबेस, विशेष रूप से :

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>

Django ORM क्वेरी के लिए नक्शे NOT (a = b)के बजाय (a <> b)या (a != b)। क्या यह आंतरिक रूप से समान है?
उपयोगकर्ता

7
@ बफ़र, वे तार्किक रूप से समान हैं, अर्थात, यह पंक्तियों के एक ही सेट को मिलाएगा या बाहर करेगा। लेकिन क्या एक विशेष RDBMS ब्रांड का अनुकूलन इसे लागू करने पर निर्भर है। उस ने कहा, मुझे आश्चर्य होगा अगर डेटाबेस के ब्रांडों में कोई अंतर था।
बिल कार्विन

साइड नोट: LINQ C # में आपको उपयोग करना है! =
टॉम स्टिकेल

! = आईबीएम डीबी 2 एलयूडब्ल्यू 10.5+
क्रिस्टी एस।

10
C # में @TomStickel LINQ SQL नहीं है।
क्रेग

109

'<>'से है SQL-92 मानक और '!='एक है मालिकाना T-SQL ऑपरेटर। यह अन्य डेटाबेस में भी उपलब्ध है, लेकिन चूंकि यह मानक नहीं है इसलिए आपको इसे केस-बाय-केस आधार पर लेना होगा।

ज्यादातर मामलों में, आपको पता चल जाएगा कि आप किस डेटाबेस से जुड़ रहे हैं, यह वास्तव में कोई समस्या नहीं है। कम से कम आपको अपनी SQL में खोज और प्रतिस्थापित करना पड़ सकता है।


मैंने देखा है कि mysql sql इसे भी उपयोग करता है
Bob The Janitor

3
क्या हम मानक भाषा के लिए इस तरह के व्यापक विस्तार को मालिकाना कह सकते हैं ? इस बिंदु पर, ऐसा लगता है कि मानक को आवश्यकता के लिए अद्यतन किया जाना चाहिए, या कम से कम दोनों सिंटैक्स की अनुमति दें।
जोहान बोउले

3
@JohanBoule अच्छी तरह से, SQL के लिए एक लिखित मानक है और मेरी जानकारी !=में इसका हिस्सा नहीं है। भले ही सभी व्यावहारिक उद्देश्यों के लिए यह एक डिफैक्टो मानक है, हमें यह भ्रमित नहीं करना चाहिए कि क्या हैं और मानक विशेषताएं नहीं हैं।
एडम लाससेक



24

वे SQL सर्वर के संबंध में मान्य और समान हैं ,

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation


यह SQL सर्वर विशिष्ट है। दी गई है कि वह SQL सर्वर के बारे में पूछता है, लेकिन क्या आप ANSI युक्ति संदर्भ देख सकते हैं कि क्या यह हम में से उन लोगों के लिए पोर्टेबल होने की गारंटी है जो उस तरह की चीज़ को जानना पसंद करते हैं?
जोएल कोएहॉर्न

6
@Joel Coehoorn, अगर आप अपने T-SQL कोड "<>" और "!" को बहुत कम पोर्ट करते हैं, तो आपकी चिंता कम से कम होगी !!
के.एम.

1
पोर्टिंग समस्या नहीं है - यह तब है, जब एक डेवलपर के रूप में, आपको पर्यावरण के बीच आगे और पीछे जाने की आवश्यकता होती है। संगति अच्छी है।
मार्क रैनसम

20

ऐसा लगता है कि माइक्रोसॉफ्ट के लिए खुद को पसंद करते हैं <>करने के लिए !=के रूप में अपनी मेज की कमी से जाहिर होता है। मैं व्यक्तिगत !=रूप से उपयोग करना पसंद करता हूं क्योंकि मैंने स्पष्ट रूप से पढ़ा है कि "बराबर नहीं" के रूप में, लेकिन यदि आप [field1 != field2]इसे दर्ज करते हैं और इसे एक बाधा के रूप में सहेजते हैं, तो अगली बार जब आप इसे क्वेरी करते हैं, तो यह दिखाई देगा [field1 <> field2]। यह मुझे कहता है कि ऐसा करने का सही तरीका है <>


15

!=गैर-एएनएसआई होने के बावजूद, एसक्यूएल की वास्तविक भावना में एक पठनीय भाषा के रूप में अधिक है। यह नहीं के बराबर चिल्लाती है। <>यह मेरे लिए (कम से कम, अधिक से अधिक) है जो सिर्फ अजीब है। मुझे पता है कि इरादा यह है कि यह या तो कम से कम है या इसलिए नहीं के बराबर है, लेकिन यह वास्तव में सरल कुछ कहने का एक जटिल तरीका है।

मुझे बस कुछ लंबे एसक्यूएल क्वेश्चन लेने हैं और उन्हें प्यार से एक्सएमएल फाइल में जगह देनी चाहिए क्योंकि मैं बेवकूफ नहीं बनूंगा।

एक्सएमएल के बारे में यह कहना बिल्कुल भी कम नहीं है कि मुझे खुद को बरबाद करने से पहले खुद <>को बदलना पड़ा !=और जांच करनी पड़ी।


6
सिर्फ CDATA ही क्यों? क्या होता है जब आपकी क्वेरी में XML होता है?
जानूस ट्रॉल्सन

12

आप टी-एसक्यूएल में से जो भी चाहें उपयोग कर सकते हैं। प्रलेखन का कहना है कि वे दोनों एक ही तरह से कार्य करते हैं। मैं पसंद करता हूं !=, क्योंकि यह मेरे (C / C ++ / C # आधारित) दिमाग के लिए "बराबर नहीं" पढ़ता है, लेकिन डेटाबेस गुरु पसंद करते हैं <>


10

मैं समझता हूं कि सी सिंटैक्स !=SQL सर्वर में अपनी यूनिक्स विरासत (Sybase SQL सर्वर दिनों में, पूर्व Microsoft SQL सर्वर 6.5) के कारण है।


7

एक विकल्प यह होगा कि NULLIF ऑपरेटर के अलावा अन्य का उपयोग करें <>या !=जो NULL को लौटाता है यदि दोनों तर्क Microsoft Docs में NULLIF के बराबर हैं । इसलिए मेरा मानना ​​है कि जहां <>और के लिए खंड को संशोधित किया जा सकता !=है:

NULLIF(arg1, arg2) IS NOT NULL

जैसा कि मैंने पाया कि, का उपयोग करना <>और !=कुछ मामलों में तारीख के लिए काम नहीं करता है। इसलिए उपरोक्त अभिव्यक्ति का उपयोग करना आवश्यक है।


6
मुझे यकीन नहीं है कि यह फ़ंक्शन <>सभी कोने के मामलों में सूचकांक के उपयोग के संबंध में भी प्रदर्शन करेगा । इसके अलावा, पठनीयता निश्चित रूप से बहुत खराब है ...
लुकास एडर

जैसा कि मैंने उत्तर में उल्लेख किया है, इसने मेरे लिए 2014 में वापस वहाँ की फ़ील्ड्स पर काम किया। यह निश्चित नहीं था कि क्लॉज़ / कंडीशन में अन्य उत्तरों को प्रतिबंधित किया गया था, लेकिन कुछ उत्थानों को देखते हुए, यह दूसरों की भी मदद करता प्रतीत होता है।
जितेन्द्रपुरोहित

1

मैंने !=इसके बजाय का उपयोग करना पसंद किया <>क्योंकि कभी-कभी मैं <s></s>SQL कमांड लिखने के लिए सिंटैक्स का उपयोग करता हूं । !=इस मामले में सिंटैक्स त्रुटियों से बचने के लिए उपयोग करना अधिक आसान है।


-6

वे दोनों टी-एसक्यूएल में स्वीकार किए जाते हैं। हालाँकि, ऐसा लगता है कि उपयोग करने <>से बहुत तेजी से काम होता है!= । मैं सिर्फ एक जटिल क्वेरी चला रहा था जो उपयोग कर रहा था !=, और इसे चलाने में औसतन लगभग 16 सेकंड का समय लगा। मैंने उन्हें बदल दिया <>और क्वेरी को चलाने के लिए औसतन अब लगभग 4 सेकंड लगते हैं। यह एक बहुत बड़ा सुधार है!


20
यदि आप SQL सर्वर में एक के बाद एक दो समान क्वेरी चलाते हैं, तो संभवतः यह मेमोरी में कैश्ड डेटा और समान प्रश्नों के लिए अनुकूलित होगा। यदि आपने इसे उल्टे क्रम में किया, तो आपको इसका विपरीत परिणाम मिल सकता है!
कोडमेकिन

2
यह भी गलत है, उनके पास दो ऑपरेटर नहीं थे जो बिल्कुल समान कार्य करते थे और एक धीमी गति से "सिर्फ 'कारण" था। कई योगदान कारक हैं कि क्यों एक ही क्वेरी अलग-अलग निष्पादन समय का उत्पादन करेगी।
इलियट संभावना

-11

हालांकि वे उसी तरह से कार्य करते हैं, !=जिसका अर्थ है, जबकि "बराबर नहीं", जबकि<> संग्रहीत मूल्य से अधिक और कम का मतलब है।

विचार करें >=<= , या यह तब समझ में आएगा जब आपके अनुक्रमित प्रश्नों में फैक्टरिंग ...<> कुछ मामलों में (सही इंडेक्स के साथ) तेजी से चलेगी, लेकिन कुछ अन्य मामलों (इंडेक्स फ्री) में वे सिर्फ एक ही चलेंगे।

यह इस बात पर भी निर्भर करता है कि आपका डेटाबेस सिस्टम मूल्यों को कैसे पढ़ता है !=और <>। डेटाबेस प्रदाता केवल इसे शॉर्टकट कर सकता है और उन्हें समान कार्य कर सकता है, इसलिए इसका कोई लाभ नहीं है। PostgreSQL और SQL सर्वर इसे शॉर्टकट नहीं बनाते हैं; जैसा कि ऊपर दिखाई देता है यह पढ़ा जाता है।


3
क्या आपके पास अपने बयान के लिए कोई सहायक संदर्भ है? दोनों ऑपरेटरों को PostgreSQL , Oracle और MySQL में बिल्कुल एक जैसा लगता है ।
घोस्टगंबर 20

8
यह पूरी तरह से गलत है, यह आपको "अधिक से अधिक और संग्रहीत मूल्य से कम" की तरह लग सकता है जब आप उन पात्रों को अपने दिमाग में जोड़ते हैं लेकिन लेक्सर के लिए यह टोकन का प्रतिनिधित्व करने का सिर्फ एक और तरीका है।
इलियट संभावना

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