NUMERIC (10, 2) में दशमलव विभाजक के रूप में अल्पविराम के साथ स्ट्रिंग संख्यात्मक मान परिवर्तित करें


12

मेरे पास चर स्तंभों की एक SQL तालिका है जिसमें ग्रीक स्वरूपित संख्याएँ हैं (हजार विभाजक के रूप में और अल्पविराम दशमलव विभाजक के रूप में)

क्लासिक रूपांतरण

CONVERT(numeric(10,2),REPLACE([value],',','.'))

काम नहीं करता है क्योंकि (हजार विभाजक) रूपांतरण को मारता है

जैसे प्रयास करें

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

मैं ऐसे मानों को सांख्यिक में बदलना चाहता हूं (10,2)

कैसे संभालना है इसका कोई सुझाव?

जवाबों:


10

( यदि आप SQL सर्वर 2012 या नए का उपयोग कर रहे हैं, तो कृपया क्लीनर दृष्टिकोण के लिए @ wBob का उत्तर देखें । नीचे दिए गए मेरे उत्तर में उल्लिखित दृष्टिकोण केवल तभी आवश्यक है जब आप SQL Server 2008 R2 या पुराने का उपयोग कर रहे हों। )

यदि आप NUMERICअल्पविराम, अवधि या स्थान की परवाह किए बिना परिवर्तित करते हैं , तो आपको हजारों 'विभाजक' की आवश्यकता नहीं है (या चाहते हैं) , इसलिए पहले उनसे छुटकारा पाएं। फिर अल्पविराम को एक अवधि / दशमलव में परिवर्तित करें और आप कर रहे हैं:

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

यह दिखाता है:

7000.45

पूर्णता के लिए, मुझे यह उल्लेख करना चाहिए कि मैंने भी कोशिश की:

  • SET LANGUAGE Greek;

  • CONVERT के लिए विभिन्न प्रारूप शैलियों को देखते हुए , लेकिन यहां कुछ भी लागू नहीं होता है।

  • प्रारूप समारोह, लेकिन इनपुट प्रकार एक अंकीय या दिनांक / समय / दिनांक मूल्य (है कि और यह एसक्यूएल सर्वर 2012 में शुरू की गई थी, इसलिए एसक्यूएल सर्वर 2008 R2 के लिए लागू या उससे अधिक नहीं) होना चाहिए।

और कुछ भी काम नहीं लग रहा था। मैं दो REPLACEकॉल की तुलना में कुछ अधिक सुरुचिपूर्ण खोजने की उम्मीद कर रहा था , लेकिन अभी तक ऐसी कोई किस्मत नहीं है।


इसके अलावा, केवल उल्लेख करने के लिए, जबकि शुद्ध टी-एसक्यूएल समाधान नहीं है, यह SQLCLR के माध्यम से भी पूरा किया जा सकता है। और, एक पूर्व-निर्मित फ़ंक्शन है जो SQL # लाइब्रेरी (जो मैंने लिखा है) को String_TryParseToDecimal नाम से करता है । यह फ़ंक्शन नि: शुल्क संस्करण में उपलब्ध है, और SQL सर्वर 2005 के साथ शुरू होने वाले SQL सर्वर के हर संस्करण में काम करता है:

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

यह दिखाता है:

7000.45000000000000000000

10

SQL सर्वर के किस संस्करण का आप उपयोग कर रहे हैं? SQL सर्वर 2012 से आप इसके तर्क के साथ TRY_PARSE का उपयोग कर सकते हैं USING culture। आप PARSE का भी उपयोग कर सकते हैं , PARSEयदि अंतर विफल हो जाता है और अंतर TRY_PARSEवापस आ जाएगा NULL, उदाहरण के लिए, जैसे कि असफल हो जाएगा

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

परीक्षण के परिणाम

HTH


2
मैंने सिर्फ अपने उत्तर के शीर्ष पर एक नोट जोड़ा है, यहां पाठकों को निर्देश दे रहा हूं कि क्या वे SQL सर्वर 2012 या नए का उपयोग कर रहे हैं।
सोलोमन रटज़की

0

निम्नलिखित कोड मेरे मामले में काम किया:

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

आउटपुट: 123.456.789,03


या चुनिंदा रूपांतरित करें (varchar, FORMAT (कास्ट (आपका अंक सांख्यिक (10,2))), '###, ###, ###। 00', 'de-de'))
शाहिद अदनान

3
ऐसा लगता है कि आप ओपी द्वारा पूछे गए सवाल का उल्टा जवाब दे रहे हैं। वे संख्यात्मक मानों को प्रारूपित नहीं करना चाहते हैं, वे स्वरूपित varchar मानों को संख्यात्मक में बदलना चाहते हैं।
ypercube y

1
इसके अलावा, दो नोट: 1) हमेशा के लिए लंबाई निर्दिष्ट VARCHAR, NVARCHAR, CHAR, और NCHARप्रकार के। किसी मामले में डिफ़ॉल्ट 30 है और अन्य मामलों में 1, जो अचूक / त्रुटि-प्रवण कोड बनाता है। 2) आप का उपयोग करते समय सटीक लेआउट की जरूरत नहीं है #। आपको #सभी अंकों के लिए उनमें से एक (जैसे #,#) की आवश्यकता है, लेकिन सभी अंकों और हजारों विभाजक को प्राप्त करने के लिए कोई हजारों विभाजक, या उनमें से दो को अल्पविराम (जैसे ) से अलग किया गया है । इसलिए, SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));जैसा आप सुझाव दे रहे हैं, वैसा ही आउटपुट देता है।
सोलोमन रटज़की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.