2013-04-04 9 views
5

SQL सर्वर में और ओरेकल में समान दो क्वेरी का आउटपुट अलग क्यों है?आउटपुट SQL सर्वर में और ओरेकल में समान क्यों है?

SELECT 20.0/-2.0/5 

SELECT 20/(-2.0)/5 
+3

** ** ** आउटपुट क्या है, और इसके बजाय आप क्या उम्मीद कर रहे हैं ?? –

+0

@marc_s मुझे क्रमशः एसक्यूएल सर्वर 2008 में '-50.000000000' और' -2.00000000' मिलता है, लेकिन उम्मीद है कि वे दोनों ही '-50.000000000' हों। –

+0

ध्यान दें कि दोनों MySQL –

उत्तर

4

मैं आपके बयान से सहमत नहीं हूं कि आउटपुट समान होना चाहिए।
यदि आप मुझसे पूछें कि 20/-2/5 अधिक आउटपुट क्या है, तो मैं आपको जवाब दूंगा कि यह उत्पादन -2 या -50 हो सकता है, कार्यान्वयन विवरण पर निर्भर करता है।

In Oracle, केवल एक चीज जो आप जानते हैं वह है कि ऑपरेटर '*' और '/' का मूल्यांकन '+' और '-' से पहले किया जाता है। लेकिन यह सब कुछ है। मुझे प्राथमिकता पर कोई दस्तावेज नहीं मिला है ऑपरेटर '*' और '/' को स्वयं के बीच देता है।
चूंकि दो क्वेरी 2 देता है, आप मान सकते हैं कि कोष्ठक छोड़ दिया गया है, और गणना बाएं से दाएं से बनाई गई है।

In SQL Server, the docs specified that

जब एक अभिव्यक्ति में दो ऑपरेटरों एक ही ऑपरेटर पूर्वता स्तर है, वे अभिव्यक्ति में अपनी स्थिति के आधार पर बाएं से दाएं मूल्यांकन किया जाता है।

तो यह गणना चश्मा के अनुरूप है:

20/2/5 = (20/2)/5 = 2 

अब ऋण चिह्न

20/-2/5 = 20/(-2/5) = -50 

जोड़ने कोष्टक फिर

20/(-2)/5 = (20/-2)/5 = -2 

तो केवल नहीं कोष्टक परिवर्तन जोड़ें आदेश, लेकिन ऋण चिह्न भी।

वास्तव में, परिणाम को अनिर्धारित माना जाना चाहिए, और आप इस पर भरोसा नहीं कर सकते हैं।
एक अच्छी तरह से परिभाषित परिणाम और सिरदर्द को रोकने के लिए कुछ कोष्ठक जोड़ें।

+0

मुझे उम्मीद है कि यह आरडीबीएमएस के बीच कार्यान्वयन के आधार पर भिन्न होगा, लेकिन ब्रांड्स के लिए एक ही आरडीबीएमएस में अलग-अलग नतीजे नहीं होंगे। –

+1

@ एंथनी क्रिस्ट: क्यों नहीं? चूंकि यह मूल रूप से अपरिभाषित है, अन्य कारक - जैसे जोड़े गए कोष्ठक - परिणाम को बहुत अच्छी तरह से बदल सकते हैं। अपने प्रश्न पर मेरी नवीनतम टिप्पणी भी देखें। –

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