एक तार को अग्रणी शून्य के साथ पैड करें ताकि यह SQL सर्वर 2008 में 3 वर्ण लंबा हो


398

मेरे पास एक स्ट्रिंग है जो 3 वर्णों तक लंबी है जब यह पहली बार SQL Server 2008 R2 में बनाया गया है।

मैं इसे अग्रणी शून्य के साथ पैड देना चाहूंगा, इसलिए यदि इसका मूल मूल्य '1' है तो नया मूल्य '001' होगा। या यदि इसका मूल मूल्य '23' था तो नया मूल्य '023' है। या यदि इसका मूल मूल्य '124' है तो नया मूल्य मूल मूल्य के समान है।

मैं SQL Server 2008 R2 का उपयोग कर रहा हूं। टी-एसक्यूएल का उपयोग करके मैं यह कैसे करूंगा?



जवाबों:


681

यदि फ़ील्ड पहले से ही एक स्ट्रिंग है, तो यह काम करेगा

 SELECT RIGHT('000'+ISNULL(field,''),3)

यदि आप '000' के रूप में दिखाना चाहते हैं

यह पूर्णांक हो सकता है - तब आप चाहेंगे

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)

जैसा कि प्रश्न के लिए आवश्यक है, यह उत्तर केवल तभी काम करता है जब लंबाई <= 3, यदि आप कुछ बड़ा चाहते हैं तो आपको स्ट्रिंग स्थिरांक और दो पूर्णांक स्थिरांक को आवश्यक चौड़ाई में बदलना होगा। जैसे'0000' and VARCHAR(4)),4


8
मेरे पास एक चार (6) क्षेत्र था जिसमें कुछ मुट्ठी भर मूल्य थे जो केवल 2-3 चार्ट लंबे थे और ऊपर मेरे लिए काम नहीं करते थे। मुझे काम करने के लिए '000000' + ISNULL (FIELD, '') के आसपास एक RTRIM जोड़ना था।
डीडीनियर

3
होगन हाँ मुझे वह मिल गया, लेकिन कोई फर्क नहीं पड़ता कि स्ट्रिंग कितनी देर तक काम नहीं करती है, मैं थोड़ा बहुत यह पता लगाने में व्यस्त हूं कि क्यों, लेकिन इसका सार यह है कि मेरे CHAR (6) क्षेत्र के साथ सिर्फ RIGHT कर रहा है ('000000) '+ ISNULL (फ़ील्ड,' '), 6) काम नहीं किया लेकिन RIGHT (RTRIM (' 000000 '+ ISNULL (फ़ील्ड,' ')), 6) ने किया।
डीडिएनर

2
ओह मैं समझता हूं, आपके पास एक स्ट्रिंग के रूप में एन्कोड किए गए नंबर के दाईं ओर रिक्त स्थान थे।
होगन

3
@dwiener आपको यह व्यवहार इसलिए मिला क्योंकि एक चार निश्चित लंबाई डेटा प्रकार है, इसलिए आपके मामले में चार (6) का अर्थ है 6 चार्ट लंबा। यदि आपका वास्तविक मूल्य 6 से कम है, तो इसे सही के साथ कंबल के साथ गद्देदार किया जाता है, इसलिए प्रस्तावित उत्तर एक चार (6) के लिए औसत परिणाम उत्पन्न करेगा।
गियान्नीस परस्केवोपोलोस

2
@ होगन, हां, लेकिन यह सवाल "sql add अग्रणी शून्य" के लिए शीर्ष 1 Google परिणाम है, इसलिए मुझे लगता है कि यह कई लोगों के लिए उपयोगी होगा (जो sqlserver का उपयोग नहीं करते हैं, लेकिन इस प्रश्न को जानने के लिए) अन्य डेटाबेस में जानें अधिक दृढ़ समारोह lpad मौजूद है। वैसे भी धन्यवाद।
दिरलिक

142

हालाँकि प्रश्न SQL Server 2008 R2 के लिए था, अगर कोई इसे 2012 संस्करण और इसके बाद के संस्करण के साथ पढ़ रहा है, तब से यह FORMAT के उपयोग से बहुत आसान हो गया ।

आप प्रारूप तर्क के रूप में या तो एक मानक संख्यात्मक प्रारूप स्ट्रिंग या एक कस्टम संख्यात्मक प्रारूप स्ट्रिंग पास कर सकते हैं ( इस संकेत के लिए वादिम ओविचनिकोव धन्यवाद )।

इस प्रश्न के लिए उदाहरण के लिए एक कोड की तरह

DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');

आउटपुट

001
001

2
यदि इनपुट नंबर 111 या 11 है तो क्या होगा?
होगन

6
1 के लिए यह 001 है, 11 के लिए यह 011 है और 111 के लिए यह 111
गीज़ा है

2
आप '00 'के बजाय' डी 3 'का उपयोग कर सकते हैं।
वादिम ओविचिनिकोव

1
यह स्वीकृत उत्तर की तुलना में काफी धीमा प्रतीत होता है, लेकिन बड़ी मात्रा में डेटा के साथ काम नहीं करने पर बहुत आसान है
रूट

2
यद्यपि यह अतार्किक लगता है, यह ध्यान देने योग्य है कि FORMAT केवल संख्यात्मक और दिनांक प्रकारों के साथ काम करता है, न कि varchar।
स्ट्रैटनव

120

सुरक्षित विधि:

SELECT REPLACE(STR(n,3),' ','0')

यह '***'n <0 या n> 999 के लिए स्ट्रिंग वापस करने का लाभ है , जो आउट-ऑफ-बाउंड्स इनपुट का एक अच्छा और स्पष्ट संकेतक है। यहां सूचीबद्ध अन्य विधियां इनपुट को 3-वर्ण वाले विकल्प में काटकर चुपचाप विफल हो जाएंगी।


10
धिक्कार है, जो कोई भी इस पृष्ठ पर उतरता है, उसे ऊपर तैरने में मदद करनी चाहिए!
मारियो

1
इस विधि से सावधान रहें। जब अभिव्यक्ति निर्दिष्ट लंबाई से अधिक हो जाती है, तो स्ट्रिंग निर्दिष्ट लंबाई के लिए ** वापस आ जाती है। उदाहरण के लिए str (n, 10), जब n = 1000000000 तब आपके पास तारे (*) दिखाई देंगे।
अनबाउंड

मुझे नहीं पता कि यह कैसे काम करता है लेकिन अद्भुत और सरल है।
RaRdEvA

1
इस एक के साथ सावधान, तार इसे तोड़ते हैं (और ओपी ने "एक स्ट्रिंग पेडिंग" के लिए कहा)। काम करता है: SELECT REPLACE(STR('1',3),' ','0')ब्रेक SELECT REPLACE(STR('1A',3),' ','0'):। यह सिर्फ आज मुझे जला दिया जब एक उपयोगकर्ता ने इनपुट स्ट्रिंग में एक पत्र दर्ज किया और मैं उस मामले का परीक्षण करने में विफल रहा।
जेफ मर्गलर

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

32

किसी भी इच्छित चौड़ाई के लिए बाएं-गद्दी के लिए एक अधिक सामान्य तकनीक यहां दी गई है:

declare @x     int     = 123 -- value to be padded
declare @width int     = 25  -- desired width
declare @pad   char(1) = '0' -- pad character

select right_justified = replicate(
                           @pad ,
                           @width-len(convert(varchar(100),@x))
                           )
                       + convert(varchar(100),@x)

हालाँकि, यदि आप नकारात्मक मूल्यों के साथ काम कर रहे हैं, और अग्रणी शून्य के साथ पैडिंग कर रहे हैं, तो न तो यह, और न ही अन्य सुझाई गई तकनीक काम करेगी। आपको कुछ ऐसा मिलेगा जो इस तरह दिखता है:

00-123

[संभवत: वह नहीं जो आप चाहते थे]

तो ... आपको कुछ अतिरिक्त हुप्स के माध्यम से कूदना होगा यहां एक दृष्टिकोण है जो नकारात्मक संख्याओं को ठीक से प्रारूपित करेगा:

declare @x     float   = -1.234
declare @width int     = 20
declare @pad   char(1) = '0'

select right_justified = stuff(
         convert(varchar(99),@x) ,                            -- source string (converted from numeric value)
         case when @x < 0 then 2 else 1 end ,                 -- insert position
         0 ,                                                  -- count of characters to remove from source string
         replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
         )

एक को ध्यान देना चाहिए कि convert()कॉल को [n]varcharपरिवर्तित होने के लिए पर्याप्त लंबाई निर्दिष्ट करनी चाहिए ताकि ट्रंकेशन के साथ परिवर्तित परिणाम प्राप्त हो सके।


2
@StenPetrov, धन्यवाद। यह सब उस पर निर्भर करता है जिसे आप पूरा करने की कोशिश कर रहे हैं। एक चीज जिसे मैंने बड़े, वास्तविक-विश्व उत्पादन डेटाबेस में निर्भर करना सीखा है, वह एक प्रकार या किसी अन्य के खराब डेटा की उपस्थिति है। और मैं 3 एएम फोन कॉल से बचना पसंद करता हूं अगर मैं संभवतः कर सकता हूं; ^)
निकोलस केरी

:) अभी भी जब उस 3AM कॉल में आता है मैं बहुत है बल्कि 10 जटिल लोगों की तुलना में 1 सरल लाइन को पढ़ने के लिए है। चर को जोड़ने से चीजें और खराब हो जाती हैं, खासकर अगर टीम के एक अन्य सदस्य ने उन्हें मक्खी पर गणना करने का फैसला किया और गैर-नकारात्मक @ एक्सपोज़र के लिए जांच नहीं की ...
स्टेन पेट्रोव

वे जोड़े गए चर सामान्यीकरण के लिए हैं - आप मानों को हार्ड कोड कर सकते हैं। एक लाइनर के लिए, आप एक स्केलर फ़ंक्शन बना सकते हैं - फिर आपके पास अपना एक लाइनर होगा।
गेरार्ड ओनील

30

यहाँ होगन के उत्तर का एक प्रकार है जो मैं SQL सर्वर एक्सप्रेस 2012 में उपयोग करता हूं:

SELECT RIGHT(CONCAT('000', field), 3)

क्षेत्र एक स्ट्रिंग है या नहीं, CONCATयह चिंता करने के बजाय, मैं सिर्फ यह करता हूं , क्योंकि यह किसी भी तरह एक स्ट्रिंग का उत्पादन करेगा। इसके अतिरिक्त यदि क्षेत्र ए हो सकता है NULL, तो ISNULLफ़ंक्शन प्राप्त करने से बचने के लिए आवश्यक हो सकता है NULL

SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)

1
जहाँ तक मुझे याद है CONCAT सिर्फ मूल्य को अनदेखा करता है अगर यह शून्य है तो पहले वाला ठीक काम करता है।
मैरी

यह समाधान फील्ड की लेन की परवाह किए बिना काम करेगा
अनबाउंड

23

मैंने हमेशा निम्न विधि को बहुत मददगार पाया है।

REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull'

15

इस फ़ंक्शन का उपयोग करें जो हर स्थिति के अनुरूप है।

CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @NumStr VARCHAR(250)

    SET @NumStr = LTRIM(@input)

    IF(@pad > LEN(@NumStr))
        SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;

    RETURN @NumStr;
END

नमूना उत्पादन

SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016 

यह स्वीकृत उत्तर होना चाहिए क्योंकि यह संख्याओं और तारों पर काम करता है । और अगर आप किसी फ़ंक्शन का उपयोग नहीं करना चाहते हैं (लेकिन क्यों नहीं) तो कुछ इस तरह से भी काम करता है: DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 12 - LEN(@NumStr)) + @NumStr;जो ऊपर सालार का पहला उदाहरण देता है। धन्यवाद सालार।
जेफ मर्गलर

मेरी टिप्पणी के ऊपर एक टाइपो निहित है, इसे पढ़ना चाहिए: DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 10 - LEN(@NumStr)) + @NumStr;जो 0000002016ऊपर दिए गए पहले उदाहरण में वापस आता है।
जेफ मर्गलर

@JeffMergler - यह संख्या और तारों पर कैसे काम करता है? यह एक फ़ंक्शन है जो पूर्णांक पैरामीटर लेता है। सवाल तार के बारे में था।
होगन

5

यहां अपने मौजूदा डेटा को अपडेट करने के इच्छुक लोगों के लिए यह प्रश्न है:

update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)

3

पूर्णांकों के लिए आप अंतर से varchar में अंतर्निहित रूपांतरण का उपयोग कर सकते हैं:

SELECT RIGHT(1000 + field, 3)

4
हालांकि, यह नकारात्मक मूल्यों के लिए पर्याप्त रूप से एक बड़ा मूल्य दिया जाएगा, आगे, आपको मिलेगा ... दिलचस्प परिणाम।
निकोलस कैरी

3

मुझे पता है कि इसका पुराना टिकट मैं सिर्फ इसे साझा करना चाहता था।

मुझे यह कोड एक समाधान की तलाश में मिला। निश्चित नहीं है कि अगर यह MSSQL के सभी संस्करणों पर काम करता है तो मेरे पास MSSQL 2016 है।

declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero

रिटर्न "0023" एसटीआर फ़ंक्शन में 4 मान सहित कुल लंबाई है। उदाहरण 4, 23 और 123 में सभी एसटीआर में 4 होंगे और शून्य की सही मात्रा जोड़ी जाएगी। आप इसे बढ़ा या घटा सकते हैं। 23 पर लंबाई प्राप्त करने की आवश्यकता नहीं है।

संपादित करें: मैं इसकी @ पोस्ट के रूप में ही देखता हूं।


2

जब मुझे निश्चित आकार के varchar (या string) आउटपुट की आवश्यकता होती है, तो मुझे पूर्णांक कॉलम के साथ समान समस्या थी। मसलन, 1 से '01', 12 से '12'। यह कोड काम करता है:

SELECT RIGHT(CONCAT('00',field::text),2)

यदि इनपुट भी varchar का एक कॉलम है, तो आप कास्टिंग भाग से बच सकते हैं।


2

अधिक गतिशील दृष्टिकोण के लिए यह प्रयास करें।

declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)

2

निश्चित लंबाई के साथ यह प्रयास करें।

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'

1

इसे लिखा क्योंकि मुझे एक विशिष्ट लंबाई (9) तक की आवश्यकताएं थीं। जब इनपुट की पैडिंग की आवश्यकता हो तो @pattern के साथ बाईं ओर पैड्स लगाएं। हमेशा @pattern में परिभाषित लंबाई वापस आनी चाहिए।

declare @charInput as char(50) = 'input'

--always handle NULL :)
set @charInput = isnull(@charInput,'')

declare @actualLength as int = len(@charInput)

declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)

if @prefLength > @actualLength
    select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength)
else
    select @charInput

1234input लौटाता है


1

सरल वह है

पसंद:

DECLARE @DUENO BIGINT
SET @DUENO=5

SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO

0

मैं यहां विशेष रूप से काम करने के लिए आया था कि मैं अपने टाइमज़ोनऑफ़सेट को SQL सर्वर 2008 में DATETIMEOFFSET में दिनांक परिवर्तित करने के लिए एक टाइमज़ोन स्ट्रिंग में कैसे परिवर्तित कर सकता हूं। सकल, लेकिन आवश्यक।

इसलिए मुझे 1 विधि की आवश्यकता है जो नकारात्मक और सकारात्मक संख्याओं के साथ सामना करेगी, यदि आवश्यक हो तो उन्हें एक अग्रणी शून्य के साथ दो वर्णों में स्वरूपित करना चाहिए। आनन-फानन जवाब मुझे पास मिल गया, लेकिन 0-5आवश्यकता के बजाय नकारात्मक टाइमज़ोन मान सामने आएंगे-05

तो उनके जवाब पर थोड़ा ट्विक के साथ, यह सभी टाइमज़ोन घंटे रूपांतरणों के लिए काम करता है

DECLARE @n INT = 13 -- Works with -13, -5, 0, 5, etc
SELECT CASE 
    WHEN @n < 0 THEN '-' + REPLACE(STR(@n * -1 ,2),' ','0') 
    ELSE '+' + REPLACE(STR(@n,2),' ','0') END + ':00'

-1

मैंने यह फ़ंक्शन बनाया है जो बिगिंट और एक अग्रणी शून्य या अन्य एकल चरित्र (अधिकतम 20 वर्ण लौटा) के लिए पूरा करता है और इनपुट संख्या की लंबाई से कम परिणामों की लंबाई के लिए अनुमति देता है:

create FUNCTION fnPadNum (
  @Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
  RETURNS VARCHAR(20)
  AS
  --Pads bigint with leading 0's
            --Sample:  "select dbo.fnPadNum(201,5,'0')" returns "00201"
            --Sample:  "select dbo.fnPadNum(201,5,'*')" returns "**201"
            --Sample:  "select dbo.fnPadNum(201,5,' ')" returns "  201"
   BEGIN
     DECLARE @Results VARCHAR(20)
     SELECT @Results = CASE 
     WHEN @sLen >= len(ISNULL(@Num, 0))
     THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
     ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
     END

     RETURN @Results
     END
     GO

     --Usage:
      SELECT dbo.fnPadNum(201, 5,'0')
      SELECT dbo.fnPadNum(201, 5,'*')
      SELECT dbo.fnPadNum(201, 5,' ')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.