यहाँ एक ही समय में दो अलग-अलग समस्याएं आ रही हैं। आइए उनमें से कुछ को देखें:
-
आप संख्याओं को DECIMAL(18, 18) के रूप में कास्ट कर रहे हैं। इसका मतलब यह है कि "मुझे एक संख्या दें जिसमें कुल 18 वर्णों के लिए जगह हो, और उनमें से 18 दशमलव के बाद होनी चाहिए"। यह तब तक ठीक काम करता है जब तक आपकी संख्या 0 से छोटी है (जो सभी ई-नंबरों के लिए सही है) लेकिन यदि आप इसे संख्याओं> 0 पर उपयोग करने का प्रयास करते हैं तो यह टूट जाएगा। संख्याओं> 0 के लिए, बस कुछ और निर्दिष्ट किए बिना दशमलव के रूप में डालें ।
-
उस स्थिति में जहां आप "जब @d जैसे '%E+%' फिर CAST(@d AS FLOAT)" जोड़ते हैं, तो आपको संख्या <0 के लिए अलग-अलग परिणाम मिल रहे हैं क्योंकि इंजन परोक्ष रूप से परिणाम अलग-अलग कास्टिंग कर रहा है। मैं नियमों को नहीं जानता कि कैसे sql सर्वर CASE परिणाम डालने का निर्णय लेता है, लेकिन स्पष्ट रूप से आपके प्रस्तावित परिवर्तन को करने से इंजन इसे एक अलग तरीके से पुन:स्थापित करता है। उन परिणामों को स्पष्ट रूप से दशमलव के रूप में कास्ट करने से समस्या ठीक हो जाती है।
-
आपको अपने परिणामों को लगातार एलटीआरआईएम और आरटीआरआईएम करने की आवश्यकता है। आप या तो प्रत्येक केस स्टेटमेंट में LTRIM और RTRIM जोड़ सकते हैं, या आप केवल LTRIM और RTRIM को केस के परिणाम बता सकते हैं।
यहां एक समाधान दिया गया है जिससे पूरी तरह से सब कुछ हल हो जाना चाहिए:
SELECT
LTRIM(RTRIM(CASE
WHEN @d like '%E-%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18))
WHEN @d like '%E+%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL)
ELSE @d
END))