2017-01-06 10 views
5

में स्थिति और नहीं() के बीच क्या अंतर है हाल ही में मैं एसक्यूएल सर्वर और ओरेकल में नहीं() में आया। अलग-अलग उदाहरणों की तुलना में अलग-अलग उदाहरणों की कोशिश की और नहीं() जैसे कि विभिन्न ऑपरेटरों जैसे LIKE, IN आदि के साथ। मुझे परिणामसेट और रिकॉर्ड गणना के मामले में कोई अंतर नहीं दिखता है, लेकिन यदि वे दोनों एक ही कर रहे हैं तो समुदाय के साथ पुष्टि करना चाहता है या कोई चेतावनी?ओरेकल और एमएस एसक्यूएल सर्वर

उदाहरण प्रश्नों

select count(*) from Emp where country not in ('ENGLAND UK', 'HAITI', 'IRELAND') 
select count(*) from Emp where not(country in ('ENGLAND UK', 'HAITI', 'IRELAND')) 
+0

SQL सर्वर में, आप सर्वर को निष्पादन योजनाएं उत्पन्न करने के लिए प्राप्त कर सकते हैं। फिर आप इन दो प्रश्नों के लिए निष्पादन योजनाओं की तुलना कर सकते हैं और देख सकते हैं कि वे समान हैं। ओरेकल में एक अलग नाम के तहत समान कार्यक्षमता है। –

+0

एसक्यूएल 2014 और 2016: 'IN()' खंड में शाब्दिक तर्क सूची के साथ, SQL निष्पादन योजनाओं में कोई अंतर नहीं है। यदि एक पीके कॉलम शामिल है, तो यह एक क्लस्टर इंडेक्स की तलाश करेगा, अन्यथा क्लस्टर्ड इंडेक्स स्कैन। एक सबक्वायरी और इष्टतम कुंजी के साथ, यह दो स्कैन और बाएं एंटी अर्ध शामिल होंगे, जहां भी 'नहीं' ऑपरेटर रखा जाता है, कोई फर्क नहीं पड़ता। – dlatikay

उत्तर

2

NOT कीवर्ड के दोनों प्लेसमेंट तार्किक बराबर हैं हो सकता है और एक ही परिणाम नहीं देंगे। NOT एक ब्रैकेट अभिव्यक्ति से पहले उस अभिव्यक्ति के परिणाम को बदल देता है, लेकिन यह पारंपरिक बूलियन तर्क है और एसक्यूएल के लिए विशिष्ट नहीं है।

टी-एसक्यूएल में, आपके उदाहरणों के लिए SQL सर्वर 2014 और SQL Server 2016 में निष्पादन योजनाएं समान हैं (धारणा: तालिका में प्राथमिक कुंजी है और country अनुक्रमित नहीं है)।

विशेष रूप से आपके द्वारा दिए गए उदाहरणों के साथ एक चेतावनी है: IN ऑपरेटर एक से अपेक्षाकृत अलग व्यवहार करता है, जब NULL इसके तर्क में मूल्य होता है। ओरेकल के लिए, see here;

T-SQL के लिए, इस पर विचार करें:

select 1 where 'A' in (null) 

यह एक पंक्ति नहीं लौटेगा।कौन सा तुच्छ प्रतीत होता है, लेकिन:

select 1 where 'A' not in (null) 

यह बयान एक पंक्ति eiher नहीं लौटेगा। अब हम, बहस कर सकते हैं अगर हम तार्किक इस तरह पहले बयान से अभिव्यक्ति को उलटने के लिए, यह निश्चित रूप से एक पंक्ति लौटना चाहिए:

select 1 where not ('A' in (null)) 

लेकिन क्योंकि IN (NULL)neither true nor false का मूल्यांकन यह काम न करे।

1

आपके मामले में, कोई वास्तविक अंतर

हालांकि इस पर देखो:

where x1 not in ('a','b','c') 
and x2 not in ('x','y','z') 

यह

where not (x1 in ('a','b','c') 
      or x2 in ('x','y','z')) 

के रूप में लिखा जा सकता है जब लेखन प्रश्नों , कभी-कभी मैं or का उपयोग करता हूं जब मैं पहचानता हूं कि मैं क्या बाहर करना चाहता हूं। यह सिर्फ not() उपयोग करने के लिए की तुलना में पुनर्लेखन के लिए orand ... not ...

3

को अंतर नहीं होगा आप AND/OR के साथ एक और शर्त है जब आसान है। यह उलट ANDOR करने और ORAND

select 1 where not(1 = 1 or 1 <> 1) 

के रूप में

select 1 where (1 <> 1 and 1 = 1) 

और

ही होगा
select 1 where not(1 = 1 and 1 <> 1) 

select 1 where (1 <> 1 or 1 = 1) 
के रूप में ही किया जाएगा

और

select 1 where not(1 = 1) or 1 = 1 

एक ही रूप में

select 1 where not(1 = 1 or 1 = 1) 
संबंधित मुद्दे