T-SQL में PadLeft फ़ंक्शन


113

मेरे पास निम्न तालिका A है:

id
----
1
2
12
123
1234

मुझे idशून्य के साथ मानों को बाएं-पैड करने की आवश्यकता है :

id
----
0001
0002
0012
0123
1234

इसे कैसे प्राप्त किया जा सकता है?

जवाबों:


197

मेरा मानना ​​है कि यह वही हो सकता है:

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

या

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

मैंने दूसरे उदाहरण पर वाक्य रचना का परीक्षण नहीं किया है। मुझे यकीन नहीं है कि अगर यह 100% काम करता है - तो इसे कुछ ट्विकिंग की आवश्यकता हो सकती है - लेकिन यह सामान्य विचार बताता है कि आपके वांछित आउटपुट को कैसे प्राप्त किया जाए।

संपादित करें

टिप्पणियों में सूचीबद्ध चिंताओं को दूर करने के लिए ...

@ pkr298 - हां एसटीआर केवल संख्याओं पर काम करता है ... ओपी का क्षेत्र एक आईडी है ... इसलिए केवल संख्या।

@Desolator - बेशक जो काम नहीं करेगा ... पहला पैरामीटर 6 वर्ण लंबा है। आप कुछ ऐसा कर सकते हैं:

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

यह सैद्धांतिक रूप से लक्ष्य पदों को स्थानांतरित करना चाहिए ... संख्या जितनी बड़ी हो जाती है, इसे हमेशा काम करना चाहिए .... भले ही इसकी 1 या 123456789 ...

इसलिए यदि आपका अधिकतम मूल्य 123456 है ... तो आपको 0000123456 दिखाई देगा और यदि आपका न्यूनतम मूल्य 1 है तो आपको 0000000001 दिखाई देगा


4
एसटीआर () केवल संख्याओं (या स्ट्रिंग क्षेत्रों में संख्या) पर काम करता है। यह कोड तब टूटता है जब आप इसका उपयोग किसी ऐसे varchar फ़ील्ड पर कर रहे हैं जिसे आप एक संख्या मानते हैं, लेकिन एक रिकॉर्ड में खराब (गैर-संख्यात्मक) डेटा है। राइट () फ़ंक्शन इस मामले में नहीं तोड़ेगा।
pkr298

1
यदि संख्या अधिक है, तो STR () फ़ंक्शन काम नहीं करेगा (जैसे STR(123456, 4)वापस आएगा****

2
@Desolator मैंने आपके द्वारा जोड़े गए परिदृश्य को सुविधाजनक बनाने के लिए एक प्रतिक्रिया और फिक्स जोड़ा है।
पैट्रिक

66

SQL सर्वर अब संस्करण 2012 से शुरू होने वाले FORMAT फ़ंक्शन का समर्थन करता है , इसलिए:

SELECT FORMAT(id, '0000') FROM TableA

चाल चलेगा।

यदि आपकी आईडी या कॉलम एक में है varcharऔर एक संख्या का प्रतिनिधित्व करता है जिसे आप पहले परिवर्तित करते हैं:

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA

चालाक और सरल, धन्यवाद! मूल प्रश्न की तारीख को देखते हुए, यह अब आधिकारिक उत्तर होना चाहिए;)
डेविड गुंडरसन

1
अगर आईडी एक स्ट्रिंग है तो आप इसे पहले पूर्णांक में बदल सकते हैं - सेलेक्ट फॉर्मेट (कन्वर्ट (इंट, आईडी), '0000')
क्रिमसनकिंग सेप

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

@ShadowWizard मैं कई पंक्तियों के साथ FORMAT का उपयोग करके तात्कालिक प्रदर्शन देख रहा हूं।
जॉनीएचके सेप

@ जॉनीएचके अच्छी तरह से शायद टेबल डिजाइन या अन्य डीबी quirks के साथ कुछ है, लेकिन फिर भी ... तथ्य यह है कि मेरे लिए यह वास्तव में धीमा था जबकि दूसरा रास्ता तेज था।
शैडो विजार्ड


43

पुरानी पोस्ट, लेकिन शायद इससे किसी को मदद मिलती है:

4 गैर-रिक्त वर्णों के समाप्त होने तक इसे पूरा करने के लिए:

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

10 तक पूरा करने के लिए:

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;

यदि कॉलम संख्यात्मक है , तो इसे ऐसे कोड के साथ पहले varchar में बदलें:

Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME

और एक संख्यात्मक क्षेत्र के साथ 10 तक पूरा करने के लिए:

SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;

1
@ सिल्वरएम-ए, एक नंबर से पहले 0s जोड़ने की कोई उपयोगिता नहीं है, क्योंकि उन्हें वैसे भी अनदेखा किया जाएगा (0003 सभी पर 3 है)। संभवतः जो आप पूरा करना चाहते हैं, उस संख्या को एक स्ट्रिंग (varchar) में डालना है और फिर उपरोक्त कथन का उपयोग करना है।
मार्सेलो मायरा

1
@ सिल्वरम-ए, अगर ऐसा है, तो बस इसे "CAST" कमांड का उपयोग करके कास्ट करें: Select RIGHT ('0000000000' + CAST (COLNNAME AS VARCHAR), 10) TABLAMAME से; क्या यही है?
मार्सेलो मायरा

@MarceloMyara यह केवल एक टिप्पणी नहीं बल्कि जवाब का हिस्सा होना चाहिए। अब खुद को जोड़ा।
शैडो विजार्ड

नोट: यह सबसे कुशल उत्तर है, जिसमें कोई फैंसी फ़ंक्शन नहीं है जो वास्तव में धीमा हो सकता है। इसलिए मैंने इसे अतिरिक्त इनाम दिया।
शैडो विजार्ड ईयर फॉर यू

12

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

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]


5

यह स्ट्रिंग्स, पूर्णांक और संख्यात्मक के लिए काम करता है:

SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)

जहां 4वांछित लंबाई है। 4 से अधिक अंकों के साथ संख्याओं के लिए काम करता है, NULLमूल्य पर खाली स्ट्रिंग देता है ।


3

अगर किसी को अभी भी दिलचस्पी है, तो मुझे DATABASE.GUIDE पर यह लेख मिला:
SQL सर्वर में लेफ्ट पैडिंग - 3 LPAD () समकक्ष

संक्षेप में, उस लेख में 3 विधियाँ उल्लिखित हैं।
मान लीजिए कि आपकी आईडी = 12 है और आपको इसे 0012 के रूप में प्रदर्शित करने की आवश्यकता है।

विधि 1 - राइट का उपयोग करें () फ़ंक्शन
पहली विधि कुछ प्रमुख शून्य को जोड़ने के बाद स्ट्रिंग के केवल सबसे दाहिने हिस्से को वापस करने के लिए राइट () फ़ंक्शन का उपयोग करती है।

SELECT RIGHT('00' + '12', 4);

परिणाम:
0012

विधि 2 - RIGHT () और REPLICATE के संयोजन का उपयोग करें (
यह विधि लगभग पिछले पद्धति की तरह ही है, एकमात्र अंतर यह है कि मैं केवल तीन शून्य रिप्लेसमेंट () फ़ंक्शन के साथ हूं:

SELECT RIGHT(REPLICATE('0', 2) + '12', 4);

परिणाम:
0012

विधि 3 - उत्तर () और एसटीआर () के संयोजन का उपयोग करें
यह विधि पिछले तरीकों से पूरी तरह से अलग कोण से आती है:

SELECT REPLACE(STR('12', 4),' ','0');

परिणाम:
0012

लेख देखें, उदाहरणों के साथ गहराई से विश्लेषण में अधिक है।


2

यह वह है जो मैं आमतौर पर उपयोग करता हूं जब मुझे एक मूल्य पैड करने की आवश्यकता होती है।

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)

1

मुझे SQL सर्वर पर एक फ़ंक्शन में इसकी आवश्यकता थी और पैट्रिक के उत्तर को थोड़ा समायोजित किया।

declare @dossierId int = 123
declare @padded_id varchar(7)


set @padded_id = REPLACE(
              SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId), 
              SPACE(1),  
              '0') 

SELECT @dossierId as '@dossierId'
      ,SPACE(LEN(@dossierId)) + convert(varchar(7)
      ,@dossierId) as withSpaces
      ,@padded_id as '@padded_id'

1

समारोह बनाएँ:

    Create FUNCTION [dbo].[PadLeft]
      (
        @Text NVARCHAR(MAX) ,
        @Replace NVARCHAR(MAX) ,
        @Len INT
      )
RETURNS NVARCHAR(MAX)
AS
    BEGIN 


        DECLARE @var NVARCHAR(MAX) 

        SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')


        RETURN   RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)


    END

उदाहरण:

Select dbo.PadLeft('123456','0',8)

मानकों के बारे में बस एक बिंदु, मैं इसनल चेक से परेशान नहीं होता, अगर मूल्य शून्य है, तो फ़ंक्शन को अभी भी उस मूल्य के लिए शून्य वापस करना चाहिए क्योंकि यह बिलिन फ़ंक्शन के लिए मानक व्यवहार है। यदि हम सब कुछ एक गैर-शून्य मान में बदल देते हैं, तो कॉलर अब अशक्त तर्क संचालन का उपयोग करने में सक्षम नहीं होगा जो वे अन्यथा उम्मीद कर रहे हैं। (मेरी कई सारणियों में अशक्त का अर्थ है 'निर्दिष्ट नहीं' और एक डिफ़ॉल्ट मान का उपयोग किया जाना चाहिए।SELECT @var = LTRIM(RTRIM(@Text))
क्रिस शेहलर

1

मैंने एक समारोह बनाया:

CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255) 
AS 
BEGIN
    DECLARE @strInt varchar(255)

    SET @strInt = CAST(@int as varchar(255))
    RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;

उपयोग करें: dbo.fnPadLeft (123, 10) का चयन करें

रिटर्न: 0000000123


0

यदि आवश्यक हो तो कुछ ओबीसीबीसी का अनुपालन निम्नलिखित हो सकता है:

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

यह इस तथ्य पर आधारित है कि आधार -10 संख्या के लिए अंकों की मात्रा इसके लॉग के अभिन्न घटक द्वारा पाई जा सकती है। इससे हम इसे वांछित पैडिंग चौड़ाई से घटा सकते हैं। पुनरावृत्ति null1 के तहत मूल्यों के लिए वापस आ जाएगी ताकि हमें ज़रूरत हो ifnull


0

मेरा समाधान कुशल नहीं है, लेकिन उस स्थिति में मेरी मदद करता है जहां मान (बैंक चेक नंबर और वायर ट्रांसफर नं।) को varchar के रूप में संग्रहीत किया गया था, जहां कुछ प्रविष्टियों में उनके साथ अल्फा संख्यात्मक मान थे और अगर लंबाई 6 वर्णों से छोटी है तो मुझे पैड करना होगा।

अगर कोई समान स्थिति में आता है तो साझा करने के लिए सोचा

declare @minlen int = 6
declare @str varchar(20)

set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 000123

set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234

set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789


set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789


0

मैंने ऐसा करने के लिए एक फ़ंक्शन बनाया, जहां आप वांछित आउटपुट वर्ण लंबाई निर्दिष्ट कर सकते हैं:

CREATE FUNCTION [dbo].[udfLeadingZero]
(
        @String VARCHAR(MAX)
,       @Len INT
)
RETURNS VARCHAR(MAX)
BEGIN
    SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
RETURN @String
END
GO

उदाहरण के परिणाम


-5

अधिक कुशल तरीका है:

Select id, LEN(id)
From TableA
Order by 2,1 

The result :
id
----
1
2
12
123
1234

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