SQL सर्वर में दशमलव से ट्रेलिंग शून्य निकालें


85

मेरे पास एक कॉलम है DECIMAL(9,6)यानी यह 999,123456 जैसे मूल्यों का समर्थन करता है।

लेकिन जब मैं 123,4567 जैसा डेटा डालता हूं तो यह 123,456700 हो जाता है

उन शून्य को कैसे हटाएं?


कृपया सही उत्तर को @ एंडोमर के उत्तर में बदल दें
dangalg

@ दंगल: मेरा मानना ​​है कि यह वास्तव में प्रस्तुति परत में किया जाना चाहिए। इसलिए मैंने कभी स्वीकार किए गए उत्तर को नहीं बदला। हालांकि, आगे के विचारों के बाद, मुझे लगता है कि मुझे स्वीकार करना चाहिए कि समुदाय ने स्पष्ट रूप से संकेत दिया कि कौन सा उत्तर सबसे अच्छा है।
abatishchev

जवाबों:


147

एक decimal(9,6)स्टोर अल्पविराम के दाईं ओर 6 अंक। अनुगामी शून्य प्रदर्शित करना है या नहीं, यह एक प्रारूपण निर्णय है, जिसे आमतौर पर ग्राहक पक्ष पर लागू किया जाता है।

लेकिन SSMS प्रारूपों के बाद से floatशून्य अनुगामी बिना, आप कास्टिंग द्वारा शून्य अनुगामी निकाल सकते हैं decimalएक करने के लिए float:

select 
    cast(123.4567 as DECIMAL(9,6))
,   cast(cast(123.4567 as DECIMAL(9,6)) as float)

प्रिंट:

123.456700  123,4567

(मेरा दशमलव विभाजक एक अल्पविराम है, फिर भी एसएसएमएस एक डॉट के साथ दशमलव को प्रारूपित करता है। जाहिर तौर पर एक ज्ञात मुद्दा है ।)


8
+1 मैंने सोचा था कि फ्लोट में रूपांतरण परिणाम में कुछ खराबी लाएगा, लेकिन यह बिल्कुल ठीक काम करता है।
मार्टिन स्मिथ

1
इस विधि के लिए एक नकारात्मक पक्ष यह है कि यदि आप "2.0" से शुरू करते हैं तो यह इसे "2" में बदल देगा। यह शायद सवाल पूछने वाले व्यक्ति के लिए ठीक है, लेकिन मुझे दशमलव के बाद एक भी शून्य रखने में सक्षम होना चाहिए, बिना किसी अन्य अनुगामी शून्य को रखने के लिए। @ user1959416 का जवाब है कि हल।
मेसन जी। ज़िविती

6
प्लस फ्लोट सामान्य रूप से संख्याओं को संग्रहीत करने के लिए बहुत खराब विकल्प है। आपको गोलाई त्रुटियां मिलेंगी क्योंकि यह एक सटीक प्रकार नहीं है। कभी भी फ्लोट का उपयोग न करें।
HLGEM

ज़ीरो को पीछे किए बिना फ़्लोट किए जाने के बारे में टिप्पणी अत्यंत उपयोगी थी
संजीव जीवन

क्या मैं यह सोचने में सही हूं कि एक दशमलव का पैमाना और सटीकता एक फ्लोट से अधिक हो सकती है और इसलिए ऐसे मामले भी हो सकते हैं, जहां (17 से अधिक अंकों के महत्वपूर्ण के साथ) यह उत्तर काम नहीं करता है?
कायुस जार्ड

31

आप FORMAT()फ़ंक्शन (SqlAzure और Sql Server 2012+) का उपयोग कर सकते हैं :

SELECT FORMAT(CAST(15.12     AS DECIMAL(9,6)), 'g18')  -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10')  -- '0.000158'
SELECT FORMAT(CAST(2.0       AS DECIMAL(9,6)), 'g15')  -- '2'

FLOAT (या REAL) का उपयोग करते समय सावधान रहें: g17( g8REAL के साथ बड़ा या (या बड़ा ) का उपयोग न करें , क्योंकि मशीन प्रतिनिधित्व की सीमित परिशुद्धता अवांछित प्रभाव का कारण बनती है:

SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17')         -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8')             -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7')             -- '0.9'

इसके अलावा, ध्यान दें कि, प्रलेखन के अनुसार :

FORMAT .NET फ्रेमवर्क सामान्य भाषा रनटाइम (CLR) की उपस्थिति पर निर्भर करता है। इस कार्य को निरस्त नहीं किया जाएगा क्योंकि यह सीएलआर की उपस्थिति पर निर्भर करता है। एक फ़ंक्शन को रीमोट करना जिसमें CLR की आवश्यकता होती है, दूरस्थ सर्वर पर त्रुटि का कारण होगा।

SqlAzure में भी काम करता है।


अपने उद्देश्यों के लिए, मुझे g8 का एक प्रारूप स्ट्रिंग "1e-08" के रूप में मेरे नंबर को स्वरूपित किया गया था जो कि मैं उसके बाद नहीं था। इस जवाब ने मुझे एक का उपयोग करने के लिए प्रेरित किया
कैयुस जार्ड

17
SELECT CONVERT(DOUBLE PRECISION, [ColumnName])

SQL सर्वर 2008 और उससे अधिक
बट_प्रोग्रामर

क्या होता है जब संख्या "123.10705000000" की तरह होती है? मैंने SELECT CONVERT (DOUBLE PRECISION, 123.10705000000) के साथ कोशिश की, लेकिन यह मुझे जवाब के रूप में "123.107" देता है। और मुझे आउटपुट के रूप में "123.10705" चाहिए? क्या कोई रास्ता है? मैं CHARINDEX का उपयोग नहीं करना चाहता।
भाविका जिक्सर

16

मैं अपने दशमलव में होने के लिए अधिक अंकों की क्षमता के कारण फ्लोट करने के लिए अनिच्छुक था जो फ्लोट का प्रतिनिधित्व कर सकता है

FORMAT जब एक मानक .net प्रारूप स्ट्रिंग 'g8' के साथ प्रयोग किया जाता है तो बहुत छोटे दशमलव के मामलों में वैज्ञानिक संकेतन लौटा (उदाहरण 1e-08) जो अनुपयुक्त भी था

एक कस्टम प्रारूप स्ट्रिंग ( https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings ) का उपयोग करके मुझे वह हासिल करने की अनुमति मिली जो मैं चाहता था:

DECLARE @n DECIMAL(9,6) =1.23;
SELECT @n
--> 1.230000
SELECT FORMAT(@n, '0.######')
--> 1.23

यदि आप चाहते हैं कि आपकी संख्या कम से कम एक अनुगामी शून्य हो, तो 2.0 2 नहीं बनती है, जैसे प्रारूप स्ट्रिंग का उपयोग करें 0.0#####

दशमलव बिंदु स्थानीयकृत है, इसलिए संस्कृतियां जो दशमलव विभाजक के रूप में अल्पविराम का उपयोग करती हैं, जहां अल्पविराम का उत्पादन होगा। है

बेशक, यह डेटा लेयर को फॉर्मेट करने (लेकिन मेरे मामले में कोई अन्य लेयर नहीं है) के लिए हतोत्साहित करने वाला अभ्यास है; उपयोगकर्ता सचमुच एक संग्रहीत कार्यविधि चला रहा है और परिणाम को ईमेल में डाल रहा है: /)


6
SELECT REVERSE(ROUND(REVERSE(2.5500),1))

प्रिंट:

2.55

2
यह विधि इस मायने में अच्छी है कि यदि शून्य है तो यह पीछे चल रहा है। इसलिए 2.5500 रिटर्न 2.55, और 2.000 रिटर्न 2.0 के बजाय 2. 2. जब आप एक वाहन में इंजन के आकार का प्रारूपण कर रहे हों तो बढ़िया ...
मेसन जी। जेविटी

4
@ MasonG.Zhwiti मुझे संदेह है कि यह दशमलव बिंदु के बाद अधिक अंक वाले कुछ दशमलव के साथ काम करेगा जैसे उदाहरण के लिए 232.33220003200: -)
gotqn

@ वार्ता अच्छा बिंदु, वह निश्चित रूप से विफल रहता है। हालांकि, हमारे विशिष्ट उपयोग के मामले में (कारों में इंजन के आकार का प्रारूपण), यह पूरी तरह से काम करता है। :)
मेसन जी। ज़िविती

के रूप में @gotqn कहा .. यह गाड़ी जब संख्या लंबा है
Ofear

यह ठीक 0.56000 जैसी संख्याओं के लिए काम नहीं करता है। यह 56 का उत्पादन करेगा। मजेदार
गुंजन शाक्य


3

इसे इस्तेमाल करे :

SELECT REPLACE(TRIM(REPLACE(20.5500, "0", " ")), " ", "0")

20.55 देता है


1
REPLACE (TRIM (REPLACE (20.00, "0", "")), "", "0") आपको पीछे छोड़ देता है। => "20."
कीथ सिरमंस

यह पूरी तरह से मेरे मामले पर लागू होता है और सबसे सरल समाधान लगता है। अंगूठे और वोट!
ओक_3260548

फ्लोट में बदलने के लिए बिना महान समाधान! एक मामूली बात 0.000बन गई .। यहाँ SELECT REPLACE(RTRIM(REPLACE(20.5500, "0", " ")), " ", "0")केवल शून्य से ट्रिलिंग शून्य को ट्रिम करने के लिए फिक्स है
विल्सन

2

मेरे पास एक समान मुद्दा था, लेकिन दशमलव बिंदु को हटाने के लिए भी आवश्यक था जहां कोई भी दशमलव मौजूद नहीं था, यहां मेरा समाधान था जो दशमलव को अपने घटकों में विभाजित करता है, और यह दशमलव बिंदु स्ट्रिंग से लंबाई पर ले जाने वाले वर्णों की संख्या को आधार बनाता है। अंश घटक (CASE का उपयोग किए बिना)। मामलों को और भी दिलचस्प बनाने के लिए, मेरी संख्या को बिना दशमलव के एक फ्लोट के रूप में संग्रहीत किया गया था।

DECLARE @MyNum FLOAT
SET @MyNum = 700000
SELECT CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),2) AS VARCHAR(10)) 
+ SUBSTRING('.',1,LEN(REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0'))) 
+ REPLACE(RTRIM(REPLACE(CAST(PARSENAME(CONVERT(NUMERIC(15,2),@MyNum/10000),1) AS VARCHAR(2)),'0',' ')),' ','0') 

परिणाम दर्दनाक है, मुझे पता है, लेकिन मैं वहां गया था, ऊपर दिए गए उत्तरों से बहुत मदद मिली।


2

परिशुद्धता के नुकसान की संभावना के कारण परिवर्तित करने से पहले FLOAT या MONEY में सबसे अच्छा तरीका परिवर्तित नहीं है । तो सुरक्षित तरीके कुछ इस तरह हो सकते हैं:

CREATE FUNCTION [dbo].[fn_ConvertToString]
(
    @value sql_variant
)
RETURNS varchar(max)
AS
BEGIN
    declare @x varchar(max)
    set @x= reverse(replace(ltrim(reverse(replace(convert(varchar(max) , @value),'0',' '))),' ',0))

    --remove "unneeded "dot" if any
    set @x = Replace(RTRIM(Replace(@x,'.',' ')),' ' ,'.')
    return @x
END

जहाँ @value किसी भी दशमलव (x, y) हो सकता है


@abatishchev, fn_ sql फ़ंक्शन के लिए एक पसंदीदा उपसर्ग है, उपसर्गों का उपयोग मानक कोडिंग और नामकरण सम्मेलन के साथ-साथ सर्वोत्तम प्रथाओं में किया जाता है, हम अपने उपसर्गों को अनुकूलित कर सकते हैं, लेकिन सर्वोत्तम प्रथाओं के लिए हम sp_संग्रहीत कार्यविधियों के लिए, fn_फ़ंक्शंस के लिए, tblतालिकाओं के लिए उपयोग करते हैं। पर ... यह एक आवश्यकता नहीं है, लेकिन हमारे डेटाबेस को व्यवस्थित करने के लिए यह सर्वोत्तम अभ्यास है।
जपज़दिवो

@japongskie: क्षमा करें, लेकिन नहीं। उपसर्गों की कोई आवश्यकता नहीं है, बिल्कुल नहीं। यह वास्तव में सबसे खराब अभ्यास है। Msdn.microsoft.com/en-us/library/dd172115(v=vs.100).aspx sqlperformance.com/2012/10/t-sql-queries/sp_prefix dba.staxexchange.com/q/25348/3186 और देखें। और भी बहुत कुछ
abatishchev

@abatishchev, ओह मैं देख रहा हूँ .. तो मैं अब स्कूल की शिक्षा का पालन नहीं करूँगा .. हाहा लोल, क्योंकि आपका लिंक mdsn से आया है, इस एक के लिए धन्यवाद, मैं अब अपना सबसे अच्छा अभ्यास
बदलूंगा

2

मुझे एक समान समस्या थी, जैसे संख्याओं से ट्रेलिंग शून्य को ट्रिम करने की आवश्यकता xx0000,x00000,xxx000

मैंनें इस्तेमाल किया:

select LEFT(code,LEN(code)+1 - PATINDEX('%[1-Z]%',REVERSE(code))) from Tablename

कोड उस क्षेत्र का नाम है जिसमें छंटनी की जाने वाली संख्या है। मनाइए कि यह किसी और के लिए सहायक हो।


यह टिप्पणी तब अच्छी तरह से काम करती है जब आप SQL सर्वर के एक संस्करण का उपयोग कर रहे हैं जो काफी पुराना है जो आप SQL सर्वर में फ़ंक्शन के लिए TRIM या FORMAT का निर्माण नहीं कर सकते हैं।
डेविड परवीन

मुझे इस जवाब के साथ एक मुद्दा मिला। यदि 'कोड' फ़ील्ड में मान '10' जैसा कुछ है तो यह '1' लौटाएगा। यदि संख्या '10 .00 'है, तो मुझे लगता है कि यह दशमलव बिंदु को भी अनदेखा करता है।
डेविड परवीन

1

एक अन्य विकल्प...

मुझे नहीं पता कि यह कितना कुशल है, लेकिन यह काम करने लगता है और फ्लोट से नहीं जाता है:

select replace(rtrim(replace(
       replace(rtrim(replace(cast(@value as varchar(40)), '0', ' ')), ' ', '0')
       , '.', ' ')), ' ', '.')

बीच की रेखा अनुगामी रिक्त स्थान को स्ट्रिप्स करती है, बाहरी दो बिंदु हटाते हैं यदि कोई दशमलव अंक नहीं हैं


1

मुझे अपने डेसीमल पर ट्रेलिंग जीरो को हटाने की आवश्यकता थी ताकि मैं केवल एक अग्रणी शून्य के साथ एक निश्चित लंबाई के तार का उत्पादन कर सकूं।

(उदाहरण के लिए मुझे १४ अक्षरों का उत्पादन करने की आवश्यकता थी ताकि १४२.०२३४०० ०० output१४23२३२४४ बन जाएगा)

मैंने प्रयोग किया parsename, reverseऔर cast as intपीछे चल रहे शून्य को हटाने के लिए:

SELECT
    PARSENAME(2.5500,2)
    + '.'
    + REVERSE(CAST(REVERSE(PARSENAME(2.5500,1)) as int))

(तब अपने अग्रणी शून्य को प्राप्त करने के लिए मैं ऊपर की लंबाई के आधार पर शून्य की सही संख्या की प्रतिकृति बना सकता हूं और इसे ऊपर के सामने से हटा सकता हूं)

मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।


@Protiguous चूँकि 1 दशमलव बिंदु है, 2.5500 को <schema_name> <ऑब्जेक्ट_name> की तरह पढ़ा जाता है। 2 रिटर्न स्कीमा नाम का दूसरा पैरामीटर, 1 का दूसरा पैरामीटर ऑब्जेक्ट नाम लौटाता है। यह आमतौर पर टेबल नाम वापस करने के लिए PARSENAME ('dbo.TableName', 2) की तरह इस्तेमाल किया जाएगा।
अली

नमस्कार .. मैं देख रहा हूँ कि मेरा उर्फ ​​आपकी टिप्पणी में झंडी दिखा रहा है। मुझे नहीं पता क्यों?
प्रोटीजेंट

26 मई 2020 को मुझसे पूछा गया सटीक सवाल था कि "PARSENAME को यहाँ कैसे काम करना है ???" खेद है कि आपको उत्तर देने में इतना समय लगा।
अली

1

TSQL में अग्रणी और अनुगामी शून्य को निकालना संभव है

  1. यदि स्ट्रिंग नहीं है, तो STR TSQL फ़ंक्शन का उपयोग करके इसे स्ट्रिंग में कनवर्ट करें

  2. अग्रणी और अनुगामी शून्य को निकालें

    SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
    
  3. मंच पर अधिक जानकारी ।


4
थोड़ा बदसूरत लेकिन यह संस्करण बचे हुए को मारता है '।':REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')
क्रिस बी

1
सावधान रहें, यदि संख्या दशमलव नहीं है तो यह शून्य को भी ट्रिम कर देगा। CHARINDEX ('।', @ नंबर)! = 1 परीक्षण करेगा।
मुफ्लिक्स

मेरी पिछली दशमलव जाँच गलत है। यहाँ बेहतर है: लेन का चयन करें (@Test) - लेन के रूप में NumberOfCharacters समझाया ((@Test, 'एक', '') की जगह): tinyurl.com/o4fc8g7 और tinyurl.com/kgzkuqk
Muflix

0

इस बारे में कैसा है? आपके फ़ंक्शन में आने वाले डेटा को @thisData मानकर:

BEGIN
  DECLARE @thisText VARCHAR(255)
  SET @thisText = REPLACE(RTRIM(REPLACE(@thisData, '0', ' ')), ' ', '0')
  IF SUBSTRING(@thisText, LEN(@thisText), 1) = '.'
    RETURN STUFF(@thisText, LEN(@thisText), 1, '')
  RETURN @thisText
END

0
case when left(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0',  ' '))), ' ', '0'), 1) = '.'
then '0' 
else ''
end +

replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0',  ' '))), ' ', '0') +

case when right(replace(ltrim(rtrim(replace(str(XXX, 38, 10), '0',  ' '))), ' ', '0'), 1) = '.'
then '0' 
else ''
end

यह भी संख्या के बीच में 0 (शून्य) की जगह नहीं है? न लगता है कि बस के सिरों पर काम करता है ...
mtk

0

मैं समझता हूं कि यह एक पुरानी पोस्ट है, लेकिन एसक्यूएल को प्रदान करना चाहूंगा जो मैं लेकर आया हूं

DECLARE @value DECIMAL(23,3)
set @value = 1.2000
select @value original_val, 
    SUBSTRING(  CAST( @value as VARCHAR(100)), 
                0,
                PATINDEX('%.%',CAST(@value as VARCHAR(100)))
            )
      + CASE WHEN ROUND( 
                        REVERSE( SUBSTRING( CAST(@value as VARCHAR(100)),
                                        PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
                                        LEN(CAST(@value as VARCHAR(100)))
                                        )
                                )
                    ,1) > 0 THEN 
            '.' 
            +  REVERSE(ROUND(REVERSE(SUBSTRING( CAST(@value as VARCHAR(100)),
                                                PATINDEX('%.%',CAST(@value as VARCHAR(100)))+1,
                                                LEN(CAST(@value as VARCHAR(100)))
                                                )
                ),1))
        ELSE '' END  AS modified_val


0

सबसे आसान तरीका है कि मूल्य को FLOAT के रूप में और फिर एक स्ट्रिंग डेटा प्रकार के लिए।

CAST(CAST(123.456000 AS FLOAT) AS VARCHAR(100))

-1

इसे इस्तेमाल करे:

select Cast( Cast( (ROUND( 35.457514 , 2) *100) as Int) as float ) /100

मैं @ user1959416 का उत्तर यहाँ बेहतर देना पसंद करता हूँ, क्योंकि यह मूल्यों को नहीं बदलता है। उदाहरण के लिए, 2.5550 से शुरू होकर, आपकी विधि 2.56 में परिणामित होती है, जबकि उनका रिटर्न 2.555 होता है।
मेसन जी। झ्विती

-1

मुझे पता है कि यह धागा बहुत पुराना है, लेकिन SQL सर्वर 2012 या इसके बाद के संस्करण का उपयोग नहीं करने वाले या किसी भी कारण से FORMAT फ़ंक्शन का उपयोग नहीं कर सकते हैं तो निम्न कार्य करता है।

इसके अलावा, यदि संख्या 1 से कम थी (उदाहरण 0.01230000) तो बहुत सारे समाधान काम नहीं करते थे।

कृपया ध्यान दें कि निम्नलिखित नकारात्मक संख्याओं के साथ काम नहीं करता है।

DECLARE @num decimal(28,14) = 10.012345000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0') 

set @num = 0.0123450000
SELECT PARSENAME(@num,2) + REPLACE(RTRIM(LTRIM(REPLACE(@num-PARSENAME(@num,2),'0',' '))),' ','0') 

क्रमशः 10.012345 और 0.012345 रिटर्न देता है।


-1

इसे इस्तेमाल करे:

select isnull(cast(floor(replace(rtrim(ltrim('999,999.0000')),',','')) as int),0)

यह एक रिटर्न 999999, ओपी अनुगामी शून्य को हटाने के लिए कह रहा है।
जपज़दिवो

-1

एक DECIMAL (9,6) कॉलम बिना किसी नुकसान के फ्लोट में बदल जाएगा, इसलिए CAST (... AS फ्लोट) ट्रिक करेगा।


@ एचएलजीईएम: यह कहना कि फ्लोट संख्याओं के लिए एक खराब विकल्प है और "कभी भी फ्लोट का उपयोग न करें" सही नहीं है - आपको बस अपनी संख्याओं को जानना होगा, उदाहरण के लिए तापमान माप फ्लोट के रूप में अच्छी तरह से जाना होगा।

@abatishchev और @japongskie: SQL संग्रहित प्रोक्स और फ़ंक्शंस के सामने उपसर्ग अभी भी एक अच्छा विचार है, यदि आवश्यक नहीं है; आपके द्वारा बताए गए लिंक केवल संग्रहीत प्रक्रियाओं के लिए "sp_" उपसर्ग का उपयोग नहीं करने का निर्देश देते हैं, जिसे आपको उपयोग नहीं करना चाहिए, अन्य उपसर्ग ठीक हैं जैसे "usp_" या "spbus_"

संदर्भ: "6 या उससे कम महत्वपूर्ण दशमलव अंकों वाले सभी पूर्णांकों को परिशुद्धता के नुकसान के बिना IEEE 754 फ़्लोटिंग-पॉइंट मान में परिवर्तित किया जा सकता है": https://en.wikipedia.org/wiki/Single-prepy_floating-point-format ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.