अग्रणी शून्य के साथ इंट को चार में कैसे परिवर्तित करें?


98

मुझे अग्रणी जीरो के साथ इंटर्वेट डेटा नर्वचर में बदलने की आवश्यकता है

उदाहरण:

1 '001' में बदलें

867 को '000867' में परिवर्तित करें, आदि।

धन्यवाद।


यह मेरी प्रतिक्रिया 4 घंटे बाद है ...

मैंने इस T-SQL स्क्रिप्ट का परीक्षण किया और मेरे लिए ठीक काम किया!

DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED

SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED

मैंने यह उपयोगकर्ता फ़ंक्शन बनाया है

T-SQL कोड:

CREATE FUNCTION CIntToChar(@intVal BIGINT, @intLen Int) RETURNS nvarchar(20)
AS
BEGIN

    -- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number

    -- @intlen contains the string size to return
    IF @intlen > 20
       SET @intlen = 20

    RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(20),@intVal)))) 
        + CONVERT(nvarchar(20),@intVal)

END

उदाहरण :

चयन dbo.CIntToChar (867, 6) ASD_ID के रूप में

आउटपुट

000,867


1
आपके पहले नमूने में NCHAR प्रकारों के बजाय CASTs का NVARCHAR होना चाहिए, क्योंकि NCHAR (3) ने हमेशा 3. की
कमी की है

जवाबों:


99

इसे इस्तेमाल करे: select right('00000' + cast(Your_Field as varchar(5)), 5)

इसका परिणाम 5 अंकों में मिलेगा, उदा: 00001, ...., 01234


1
ध्यान दें कि पोस्टग्रेज के लिए आपको + को बदलने की आवश्यकता होगी, इसलिएselect right('00000' || cast(Your_Field as varchar(5)), 5)
ronedg

56

आप SQL Server 2012 में शुरू की गई FORMAT () फ़ंक्शन का भी उपयोग कर सकते हैं । http://technet.microsoft.com/library/hh213505.aspx

DECLARE @number1 INT, @number2 INT

SET @number1 = 1
SET @number2 = 867

SELECT FORMAT(@number1, 'd10')
SELECT FORMAT(@number2, 'd10')

मैं SQL2012 पर सहमति दूंगा, लेकिन उन SQL 2008r2 और पुराने के लिए, मेरे समाधान का परिणाम मिलेगा
GoldBishop

1
बस FORMAT Sql सर्वर 2012 का परीक्षण किया गया है - यह धीमा है, जैसा कि "कई सेकंड प्रति एक संख्या" धीमा है। दूर रहो।
मुपोसैट

@Muposat, क्या आप उस परीक्षण के लिए कोड प्रदान कर सकते हैं? यह बहुत ज़रूरी है। अग्रिम में धन्यवाद।
डियोमेडेस डोमिनगेज

3
@ डियोमीडेस डोमिनगेज को एक साल हो गया है, इसलिए मेरा अब मूल परीक्षण नहीं है। मैं वास्तव में तेजी से सर्वर पर एक और परीक्षण चलाता हूं, और 1 मिलियन संख्याओं को प्रारूपित करने के लिए 32 सेकंड का समय मिला। दुनिया का अंत नहीं है, लेकिन गुयेन ट्रान द्वारा पोस्ट किया गया समाधान 1 सेकंड में करता है। बस टेस्ट करने के लिए @i int = 0 से 10000000 तक लूप बनाएं।
Muposat

22

REPLICATEइसलिए प्रयोग करें कि आपको सभी प्रमुख शून्य को हार्ड कोड नहीं करना है:

DECLARE @InputStr int
       ,@Size     int
SELECT @InputStr=123
      ,@Size=10

PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)

उत्पादन:

0000000123

13

इस सवाल पर हाई-जैक के लिए नहीं, लेकिन यह नोट करने की जरूरत है कि आपको (N) CHAR डेटा-टाइप के बजाय (N) VARCHAR का उपयोग करने की आवश्यकता है।

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )

खंड के ऊपर, SQL 2005 से सही प्रतिक्रिया नहीं देगा

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )

खंड के ऊपर, SQL 2005 से वांछित प्रतिक्रिया का उत्पादन करेगा

वर्चर आपको मक्खी पर वांछित उपसर्ग लंबाई प्रदान करेगा। जहां निश्चित लंबाई डेटा प्रकार के रूप में लंबाई पदनाम और समायोजन की आवश्यकता होगी।


6

मुझे इस्तेमाल करना पसंद है

DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4

select right( POWER(10, @Length) + @Number, @Length)

यह मुझे देता है

000000004

1
थोड़ा हैकी लगता है, लेकिन इसने मेरे लिए DB2 में काम किया। मुझे काम करने के लिए ऊपर के जवाब नहीं मिले।
नाथन एम।

2
मुझे भी यह पसंद है। यदि लंबाई हार्डकोड है, तो आप बस उपयोग कर सकते हैं RIGHT(1000+Number, 3)- अच्छा, छोटा और तेज़
माफ़-सॉफ्ट

1
यह 2005 से सभी SQL सर्वर वेरिएंट पर काम करता है। पसंदीदा उत्तर।
Fandango6868

1
10 का क्या मतलब है?
Fandango68

1
@ Fandango68 ऊपर '10' में 'POWER (10, @Length)' क्योंकि हम बेस 10 अंकगणित का उपयोग करते हैं - इसलिए ऊपर माफ़-सॉफ्ट उत्तर में '1000' का शाब्दिक अर्थ POWER (10, 3) - 10 ^ 3 के बराबर है = 1000.
qxotk

4

डेटा प्रकार "int" 10 अंकों से अधिक नहीं हो सकता है, इसके अतिरिक्त "लेन ()" फ़ंक्शन ints पर काम करता है, इसलिए लेन () फ़ंक्शन को कॉल करने से पहले int को स्ट्रिंग में बदलने की आवश्यकता नहीं है।

अंत में, आप उस मामले को ध्यान में नहीं रख रहे हैं जहां आपके int> अंकों की कुल संख्या जिसे आप चाहते हैं कि वह (@intLen) में गद्देदार हो।

इसलिए, एक अधिक संक्षिप्त / सही समाधान है:

CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
AS
BEGIN
    IF @intlen > 20 SET @intlen = 20
    IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
    RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
END

3

बहुत सुरुचिपूर्ण नहीं है, लेकिन मैं एक ही संख्या में अग्रणी शून्य के साथ एक सेट मान जोड़ता हूं जो मैं उस संख्यात्मक के लिए चाहता हूं जिसे मैं कनवर्ट करना चाहता हूं, और राइट फ़ंक्शन का उपयोग करना चाहता हूं।

उदाहरण:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)

परिणाम: '000867'


2

SQL सर्वर 2008 या इसके बाद के संस्करण के लिए एक पंक्ति समाधान ( प्रति se ):

DECLARE @DesiredLenght INT = 20;
SELECT 
    CONCAT(
        REPLICATE(
            '0',
            (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
        [Column])
FROM Table;

SIGNअभिव्यक्ति द्वारा गुणन के बराबर है MAX(0, @DesiredLenght-LEN([Column]))। समस्या यह है कि MAX()केवल एक तर्क को स्वीकार करता है ...


1

मुझे यहाँ एक अच्छा लेख मिला :

अग्रणी शून्य के साथ एक स्ट्रिंग पैडिंग

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


1
    select right('000' + convert(varchar(3),id),3) from table

    example
    declare @i int
    select @i =1

select right('000' + convert(varchar(3),@i),3)

BTW अगर यह एक अंतर स्तंभ है तो यह अभी भी शून्य नहीं रखेगा बस इसे प्रस्तुति परत में रखें या यदि आपको वास्तव में SELECT करना है


1

एक ही मुद्दा था, यह है कि मैंने कैसे हल किया ... सरल और सुरुचिपूर्ण। "4" कितना लंबा होना चाहिए, इससे कोई फर्क नहीं पड़ता कि पूर्णांक की लंबाई कितनी है, यह शून्य से "4" तक पैड होगा।

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))

1

मेरे मामले में मैं चाहता था कि मेरा क्षेत्र 10 चरित्र क्षेत्र (NVARCHAR (10)) में 0 से आगे है। स्रोत फ़ाइल में अग्रणी 0 की जरूरत नहीं है, फिर किसी अन्य तालिका में शामिल होने के लिए। यह SQL Server 2008R2 पर होने के कारण बस:

सेट फील्ड = राइट (('0000000000' + [फील्ड]), १०) (प्रारूप का उपयोग नहीं कर सकते)

मौजूदा डेटा के खिलाफ यह प्रदर्शन किया। तो इस तरह से 1 या 987654321 अभी भी सभी 10 स्थानों को अग्रणी 0 से भर देगा।

जैसा कि नया डेटा आयात किया जा रहा है और फिर एक्सेस डेटाबेस के माध्यम से टेबल पर डंप किया गया है, मैं किसी नए रिकॉर्ड के लिए SQL सर्वर तालिका में एक्सेस से अपील करते समय प्रारूप ([फ़ील्ड], "0000000000") का उपयोग करने में सक्षम हूं।


0
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- 'RTRIM' के बिना, लौटाया गया मान है 3__!!!

SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED

- 'RTRIM' के बिना, लौटाया गया मान है 867___!!!

SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED

0

उपयोग करना RIGHTएक अच्छा विकल्प है लेकिन आप निम्न कार्य भी कर सकते हैं:

SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)

Nआपके द्वारा प्रदर्शित अंकों की कुल संख्या कहां है। तो अग्रणी शून्य के साथ 3 अंकों के मूल्य के लिए ( N = 3):

SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)

या वैकल्पिक रूप से

SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)

यह जो कर रहा है वह वांछित मूल्य को 10 बड़े की शक्ति में जोड़ रहा है ताकि पर्याप्त अग्रणी शून्य उत्पन्न किया जा सके, फिर अग्रणी 1 को काट दिया जाए।

इस तकनीक का लाभ यह है कि परिणाम हमेशा एक ही लंबाई SUBSTRINGका होगा RIGHT, जिसके बजाय इसके उपयोग की अनुमति होगी , जो कुछ क्वेरी भाषाओं (जैसे HQL) में उपलब्ध नहीं है।


0

MYSQL में मेरे लिए यह काम:

FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
  RETURNS varchar(255) CHARSET utf8
BEGIN
  return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
END

उदाहरण के लिए:

leadingZero('000',999); returns '999'
leadingZero('0000',999); returns '0999'
leadingZero('xxxx',999); returns 'x999'

आशा है कि यह मदद करेगा। सादर


0

SQLServer में काम करता है

declare @myNumber int = 123
declare @leadingChar varchar(1) = '0'
declare @numberOfLeadingChars int = 5

select right(REPLICATE ( @leadingChar , @numberOfLeadingChars ) + cast(@myNumber as varchar(max)), @numberOfLeadingChars)

का आनंद लें


-2

मैं सोच रहा था, क्या यह आपके किसी काम आएगा?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.