SQL सर्वर Server-100/-100*10=0 Server में एक अजीब ऑपरेशन समस्या




sql-server tsql (2)

  • यदि आप SELECT -100/-100*10 को निष्पादित करते हैं तो परिणाम 0
  • यदि आप SELECT (-100/-100)*10 को निष्पादित करते हैं तो परिणाम 10
  • यदि आप SELECT -100/(-100*10) निष्पादित करते हैं, तो परिणाम 0
  • यदि आप Select SELECT 100/100*10 को निष्पादित करते हैं तो परिणाम 10

BOL राज्यों:

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

तथा

Level   Operators
  1     ~ (Bitwise NOT)
  2     * (Multiplication), / (Division), % (Modulus)
  3     + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)

क्या BOL गलत है, या मैं कुछ याद कर रहा हूँ? ऐसा लगता है कि - (अपेक्षित) पूर्वता को फेंक रहा है।


BOL सही है। - * तुलना में कम पूर्वता है, इसलिए

-A * B

के रूप में पार्स किया जाता है

-(A * B)

गुणा किया जा रहा है कि यह क्या है, आप आम तौर पर इस पर ध्यान नहीं देते हैं, सिवाय दो अन्य बाइनरी ऑपरेटरों में समान पूर्वता के साथ मिश्रण करते समय: / और % (और % इस तरह के यौगिक अभिव्यक्तियों में शायद ही कभी उपयोग किया जाता है)। इसलिए

C / -A * B

के रूप में पार्स किया जाता है

C / -(A * B)

परिणामों की व्याख्या करना। यह प्रति-सहज है क्योंकि अधिकांश अन्य भाषाओं में, यूनिरी माइनस में * और / से अधिक पूर्वता है, लेकिन टी-एसक्यूएल में नहीं है, और यह सही ढंग से प्रलेखित है।

इसका वर्णन करने का एक अच्छा (?) तरीका:

SELECT -1073741824 * 2

एक अंकगणितीय अतिप्रवाह पैदा करता है, क्योंकि -(1073741824 * 2) एक मध्यवर्ती के रूप में 2147483648 उत्पादन करता है, जो एक INT में फिट नहीं होता है, लेकिन

SELECT (-1073741824) * 2

अपेक्षित परिणाम -2147483648 , जो करता है।


दस्तावेज़ीकरण में ध्यान दें कि (शायद प्रति-सहज रूप से) पूर्ववर्ती का क्रम - (Negative) तीसरा है।

तो आप प्रभावी रूप से प्राप्त करें:

-(100/-(100*10)) = 0

यदि आप उन्हें वैरिएबल में रखते हैं, तो आप ऐसा होते हुए नहीं देखेंगे, क्योंकि कोई एकतरफा ऑपरेशन नहीं है जो गुणा के बाद होता है।

तो यहाँ A और B एक समान हैं, जबकि C, D, E आपको दिखाई देने वाला परिणाम दिखाते हैं (E के साथ पूर्ण कोष्ठक)

DECLARE @i1 int, @i2 int, @i3 int;

SELECT @i1 = -100,
       @i2 = -100,
       @i3 = 10;

SELECT @i1/@i2*@i3      [A],
       -100/(-100)*10   [B],
       -100/-100*10     [C],
       -100/-(100*10)   [D],
       -(100/-(100*10)) [E];

A - 10
B - 10
C - 0
D - 0
E - 0





operator-precedence