किसी SQL कथन में फ़ील्ड से अग्रणी शून्य हटा रहा है


99

मैं एक SQL क्वेरी पर काम कर रहा हूँ जो SQLServer डेटाबेस से एक एक्सट्रैक्ट फाइल बनाने के लिए पढ़ती है। एक विशेष क्षेत्र से अग्रणी शून्य को हटाने की आवश्यकताओं में से एक, जो एक साधारण VARCHAR(10)क्षेत्र है। इसलिए, उदाहरण के लिए, यदि फ़ील्ड में '00001A' है, तो SELECT स्टेटमेंट को डेटा को '1A' के रूप में वापस करना होगा।

क्या इस तरह से अग्रणी शून्य को आसानी से हटाने के लिए SQL में एक रास्ता है? मुझे पता है कि एक RTRIMफ़ंक्शन है, लेकिन यह केवल रिक्त स्थान को हटाने के लिए लगता है।


3
डेविड वॉकर के लिए एक वोट दें के रूप में stackoverflow.com/a/11129399/1635441 प्रतिक्रिया, Arvo के जवाब को देखें पोस्ट: stackoverflow.com/a/662437/1635441
ramizmoh

जवाबों:


152
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

8
यह समस्या तब होगी जब स्ट्रिंग पूरी तरह से "0" से बना होगा, क्योंकि यह कभी भी गैर-"0" वर्ण से मेल नहीं खाएगा।
कैड रूक्स

सच। यह इस मामले में शून्य के सभी unmodified स्ट्रिंग लौटेगा। यदि यह एक समस्या है, तो patindex के वापसी मूल्य को शून्य के खिलाफ परीक्षण करना होगा।
इयान होरविल

@Zapnologica: नहीं। आपको इसे "अपडेट टेबलनेम सेट कॉलमनेम = ..." स्टेटमेंट में डालना होगा।
इयान होरविले

ज़रूर, अगर आप अपडेट स्टेटमेंट का उपयोग करते हैं।
श्रीवास्तव

1
इस समाधान का उपयोग करने से पहले, कृपया यहां पोस्ट किए
ऑस्करसोसा

27
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')

मुझे "रिप्लेसमेंट फंक्शन के लिए 3 तर्कों की आवश्यकता है।" मेरा मानना ​​है कि इसे सेलेक्ट रिप्लेस (ltrim (बदलें (ColumnName, '0', '')), '', '0') को
पढ़ना चाहिए

5
यह विफल हो जाएगा अगर मूल्य में एक जगह है। उदाहरण: "0001 बी" "1 बी" बन जाना चाहिए, लेकिन इसके बदले "10 बी" बन जाएगा।
ओमेर

1
@ ओमर का उल्लेख किया गया है, यह सुरक्षित नहीं है अगर स्ट्रिंग में कुछ स्थान हैं। बेहतर समाधान - पहले उन रिक्त स्थानों को चार के साथ बदलें जो इनपुट में प्राप्त करने की संभावना नहीं है, और 0-लेट्रिम के बाद, इन चार्ट को बाद में रिक्त स्थान पर पुनर्स्थापित करें। अंत में काफी जटिल दिखता है :( उदाहरण: सेलेक्ट रिप्लेस (बदलें (ltrim (रिप्लेस (30 000309933200,00 USD),, ’,’ | ’), '0’,) ’),,’, ’0’ '),' | ',' ') -> 309933200,00 USD
रॉबर्ट

5
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

रिटर्न N0Z, यानी अग्रणी शून्य और इससे पहले आने वाली किसी भी चीज़ से छुटकारा मिलेगा।


5
यदि यह इससे पहले कुछ आता है तो यह एक अग्रणी 0 कैसे है?
xxbbcc

4

मुझे इसकी समान आवश्यकता थी और इसका उपयोग किया:

select 
    case 
        when left(column,1) = '0' 
        then right(column, (len(column)-1)) 
        else column 
      end

3

यदि आप चाहते हैं कि क्वेरी शून्य के बजाय स्ट्रिंग या उस मूल्य के लिए किसी भी अन्य मूल्य के बदले 0 तो आप इसे इस तरह से केस स्टेटमेंट में बदल सकते हैं:

select CASE
      WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
       THEN '0'
      ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
      END

2

आप इसका उपयोग कर सकते हैं:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')

0

आप यह कोशिश कर सकते हैं - केवल विशेष शून्य को हटाने के लिए यह विशेष ध्यान रखता है यदि आवश्यक हो तो:

DECLARE @LeadingZeros    VARCHAR(10) ='-000987000'

SET @LeadingZeros =
      CASE WHEN PATINDEX('%-0', @LeadingZeros) = 1   THEN 
           @LeadingZeros
      ELSE 
           CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
      END   

SELECT @LeadingZeros

या आप बस कॉल कर सकते हैं

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 

0

यहाँ SQL स्केलर मान फ़ंक्शन है जो स्ट्रिंग से अग्रणी शून्य हटाता है:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Vikas Patel
-- Create date: 01/31/2019
-- Description: Remove leading zeros from string
-- =============================================
CREATE FUNCTION dbo.funRemoveLeadingZeros 
(
    -- Add the parameters for the function here
    @Input varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Result varchar(max)

    -- Add the T-SQL statements to compute the return value here
    SET @Result = @Input

    WHILE LEFT(@Result, 1) = '0'
    BEGIN
        SET @Result = SUBSTRING(@Result, 2, LEN(@Result) - 1)
    END

    -- Return the result of the function
    RETURN @Result

END
GO

0

मामले में आप एक अज्ञात आकार के साथ एक स्ट्रिंग से अग्रणी शून्य को निकालना चाहते हैं।

आप STUFF कमांड का उपयोग करने पर विचार कर सकते हैं।

यहाँ एक उदाहरण है कि यह कैसे काम करेगा।

SELECT ISNULL(STUFF(ColumnName
                   ,1
                   ,patindex('%[^0]%',ColumnName)-1
                   ,'')
             ,REPLACE(ColumnName,'0','')
             )

फ़िडलर विभिन्न परिदृश्यों में देखें यह कवर करेगा

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=14c2dca84aa28f2a7a1fac59c9412d48


-1

महीने के अग्रणी 0 को हटाने के लिए निम्नलिखित कथन निश्चित रूप से काम करेगा।

SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8) 

बस GETDATE()अपनी तालिका का दिनांक फ़ील्ड बदलें ।


3
इस प्रश्न का उत्तर वास्तव में कैसे है?
deutschZuid

-2

आप यह कोशिश कर सकते हैं SELECT REPLACE(columnname,'0','') FROM table


3
यह अपनी स्थिति के बावजूद 0 को हटा देगा। सवाल केवल प्रमुख लोगों के बारे में पूछ रहा है।
सुनील

-2

अग्रणी 0 को हटाने के लिए, आप संख्या स्तंभ को 1 Eg से गुणा कर सकते हैं: Select (ColumnName * 1)


3
'1 ए' * 1 क्या समान है?
जोनाथन

10 * 1 क्या होगा?
रतन कुमार

प्रश्न में कहा गया था कि स्तंभ प्रकार VARCHAR (10) है, इसलिए गुणा करना संभव नहीं है।
y434y

-2
select replace(replace(rtrim(replace(replace(replace(replace(ltrim(replace(replace([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') As Result

यह एक Sql स्क्रिप्ट है जो 2017 से पहले tsql में TRIM कमांड की कार्यक्षमता का अनुकरण करती है, मूल रूप से अन्य पुनर्संबंधों के समान है, लेकिन अन्य एक एकल असामान्य चरित्र के साथ प्रतिस्थापित करते हैं जो अभी भी हो सकता है, '' आरटीआरआईएम '' या '[] Ltrim] 'पाठ में अभी भी हो सकता है, लेकिन एक अद्वितीय पाठ के साथ टोपी की जगह, उदाहरण के लिए एक गाइड उस समस्या को हल करेगा।

मैंने गति के संबंध में इसका परीक्षण किया


-3

मैंने ऊपर के विचारों से उधार लिया है। यह न तो तेज है और न ही सुरुचिपूर्ण है। लेकिन यह सही है।

मामला

WHEN left(column, 3) = '000' THEN right(column, (len(column)-3))

WHEN left(column, 2) = '00' THEN right(a.column, (len(column)-2))

WHEN left(column, 1) = '0' THEN right(a.column, (len(column)-1))

ELSE 

समाप्त


यह 3 से अधिक शून्य के लिए अनुमति देने के लिए गतिशील नहीं है।
जोफलेट

-3
select CASE
         WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
           THEN ''
           ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END

1
आपको अपने उत्तरों के साथ स्पष्टीकरण देना चाहिए, न कि केवल एक कोड स्निपेट। इसके अलावा, कोड के रूप में कोड प्रारूपित करें (पाठ-प्रवेश बॉक्स के शीर्ष पर एक बटन है)।
डेविड हेमैन

-4
select ltrim('000045', '0') from dual;

LTRIM
-----
45

यह करना चाहिए।


2
Sql सर्वर के लिए कोई अधिभार नहीं है।
बिलरॉब

PostgreSQL में यह लिखने के लिए पर्याप्त है select trim(leading '0' from '001A');, लेकिन ओपी SQL सर्वर के लिए पूछ रहा था।
y434y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.