SQL सर्वर में अग्रणी शून्य के साथ पैडिंग करके संख्याओं का प्रारूपण


119

हमारे पास एक पुरानी SQL टेबल है जिसका उपयोग SQL Server 2000 द्वारा 10 वर्षों के लिए किया गया था।

इसमें, हमारे कर्मचारी बैज नंबर को उसी char(6)से संग्रहीत किया जाता 000001है 999999

मैं अब एक वेब एप्लिकेशन लिख रहा हूं, और मुझे कर्मचारी बैज नंबर स्टोर करने की आवश्यकता है।

मेरी नई तालिका में, मैं शॉर्टकट ले सकता है और पुराने तालिका की प्रतिलिपि, लेकिन मैं, बेहतर आंकड़ा अंतरण, छोटे आकार, आदि के लिए उम्मीद कर रहा हूँ बस भंडारण के द्वारा intसे मूल्यों 1को 999999

C # में, मैं जल्दी intसे बैज नंबर का उपयोग करके एक मान को प्रारूपित कर सकता हूं

public static string GetBadgeString(int badgeNum) {
  return string.Format("{0:000000}", badgeNum);
  // alternate
  // return string.Format("{0:d6}", badgeNum);
}

मैं इस साधारण एसक्यूएल क्वेरी को कैसे लौटाए गए मूल्य के रूप में अच्छी तरह से प्रारूपित करूंगा?

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0

यदि EmployeeID7135 है, तो यह क्वेरी वापस आनी चाहिए 007135


चूँकि अग्रणी 0क्षेत्र इस क्षेत्र के लिए महत्वपूर्ण हैं, इसलिए इसे INTबिल्कुल भी क्यों बदलें ?
Oded

2
SQL Server 2012 में आखिरकारFORMAT C # :-)
marc_s

1
@Oden: intमान काफी कम जगह लेते हैं char(6), और निर्मित किए गए भाग में इन प्रविष्टियों में से कई होंगे। दक्षता।
jp2code

क्या आप किसी समस्या का सामना करने से पहले अनुकूलन कर रहे हैं?
ओलेड

4
आइए देखें, आपके पास एक मिलियन बैज नंबर हैं और आप यह आंकते हैं कि आप DATALENGTH()प्रत्येक के अनुसार दो बाइट्स बचा सकते हैं। चूंकि कॉलम एक इंडेक्स में हो सकता है, इसलिए आप 2MB से अधिक की बचत कर सकते हैं। और अन्य स्तंभों के साथ, यह जोड़ा गया कि 2 बाइट्स पंक्ति की लंबाई को कम करने के लिए पर्याप्त हो सकती है ताकि प्रति पंक्ति 4KB पेज को बचाया जा सके। क्या यह एक मोबाइल प्लेटफ़ॉर्म पर होस्ट किया जा रहा है, या आप एक अनुत्पादक क्षेत्र में अपना ध्यान केंद्रित कर रहे हैं?
HABO

जवाबों:


172

आपकी कुल लंबाई के लिए नंबर 6 को बदलें:

SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId

यदि स्तंभ एक INT है, तो आप RTRIM का उपयोग करके इसे VARCHAR में परिवर्तित कर सकते हैं

SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)

और इन 0 को हटाने और 'वास्तविक' संख्या वापस पाने के लिए कोड:

SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)

1
+1 आपने मुझे यह भी दिखाया कि 0s कैसे निकालें! मुझे इसका परीक्षण करने दो, और मैं इसे एक उत्तर के रूप में चिह्नित करूँगा।
jp2code

आपको शून्य को हटाने के लिए कोड की आवश्यकता नहीं है, बस असाइन करें या एक इंट में कनवर्ट करें और वे स्वचालित रूप से हटा दिए जाएंगे।
जिम्बो

2
यह केवल तभी काम करता है जब इसमें दिया गया मान एक स्ट्रिंग है, यदि आप एक पूर्णांक पास करते हैं तो आप उसी मान से बाहर निकलते हैं जिसे आपने पास किया था।
Mordy

2
हालांकि इसका पुराना ... "+ कर्मचारी" के बजाय "+ कन्वर्ट (varchar, EmployeeID)" का उपयोग करके इस मुद्दे को सुलझाना चाहिए
कृष्णा सरमा

3
यह एक अच्छा तरीका है जब तक कि कर्मचारी 6 अंकों से अधिक न हो जो NULL परिणाम का कारण बनता है। संपर्क समारोह का उत्तर है: सेनेट कॉन्कैट (REPLICATE ('0', 6-LEN (CONVERT (varchar, EmployeeId))), EmployeeId)
महमूद मोरवेल 23/15

125

बस FORMAT फ़ंक्शन (SQL सर्वर 2012 या नए पर काम करता है) का उपयोग करें:

SELECT FORMAT(EmployeeID, '000000')
FROM dbo.RequestItems
WHERE ID=0 

संदर्भ: http://msdn.microsoft.com/en-us/library/hh213505.aspx


1
यह एक पुराना प्रश्न है - SQL सर्वर 2012 के सामने आने से पहले।
jp2code

19
फिर भी, मैं इस बुलबुले को अब ऊपर से थोड़ा करीब से देखना चाहूंगा।
डेव हेन्स

4
बस मामले में किसी को आश्चर्य हो रहा है। Formatडेटा प्रकार को संरक्षित नहीं करता है लेकिन स्पष्ट रूप से nvarchar को धर्मान्तरित करता है:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
राल्फ

2
यह तरीका सबसे सरल और IMHO सबसे अच्छा समाधान है।
रॉबर्ट लूजो

यदि आप इसे बड़े डेटासेट के लिए उपयोग कर रहे हैं, तो इस फ़ंक्शन से अवगत रहें
amd

33

आप इस तरह से अपनी प्रक्रिया को बदल सकते हैं

SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText, 
       EmployeeID
FROM dbo.RequestItems 
WHERE ID=0 

हालाँकि यह मानता है कि आपका EmployeeIDसंख्यात्मक मान है और यह कोड परिणाम को स्ट्रिंग में बदल देता है, मैं फिर से मूल संख्यात्मक मान जोड़ने का सुझाव देता हूं

EDIT बेशक मैंने ऊपर दिए गए सवाल को ध्यान से नहीं पढ़ा है। यह कहता है कि क्षेत्र एक char(6)ऐसा कर्मचारी है जो एक संख्यात्मक मान नहीं है। जबकि इस उत्तर में अभी भी प्रति से अधिक मूल्य है, यह ऊपर दिए गए प्रश्न का सही उत्तर नहीं है।


यह मेरे विचार से करने का सबसे साफ तरीका है। धन्यवाद
iheartcsharp

क्या यह '000000'वास्तव में आवश्यक है ..? '0'ठीक काम भी कर रहा है। क्या सिर्फ एक 0 का उपयोग करना सुरक्षित है ..?
शशवत

1
ओपी ने परिणाम के रूप में 6 वर्ण लंबाई की स्ट्रिंग मांगी। विशेष रूप से यदि कर्मचारी 7135 है, तो यह क्वेरी 007135 वापस आनी चाहिए । केवल एक '0' का उपयोग करके रिटर्न 07135नहीं 007135। पूरा विचार 6 स्ट्रिंग स्ट्रिंग को सम्‍मिलित करने के लिए है जो सभी 0स्ट्रिंग परिवर्तित कर्मचारी से बना है, फिर दाहिने किनारे से स्टार्ट करने में 6 चार्ट लगते हैं । आईडी से ऊपर की जो भी लंबाई है वह विधि हमेशा एक स्ट्रिंग होती है जिसमें केवल 6 char की लंबाई तक पहुंचने के लिए शून्य चार की संख्या के साथ एक स्ट्रिंग होती है
स्टीव

यह 5 शून्य हो सकता है '00000'क्योंकि EmployeeIDइसमें कम से कम एक अंक होगा। लेकिन REPLICATE()फ़ंक्शन अधिक फिट लगता है, जैसे अन्य उत्तरों में
nosklo

26

होशियार होने से नफरत है, और यह बहुत आसान लगता है। केवल एक स्ट्रिंग रूपांतरण और सरल जोड़ के बाद भी बेहतर प्रदर्शन कर सकते हैं।

राइट (1000000 + कर्मचारी, 6) का चयन करें ...

बस यह सुनिश्चित करें कि "1000000" में कम से कम इतने शून्य हों जितने आकार की आवश्यकता हो।


11

मैं सभी को एक स्थान पर पोस्ट कर रहा हूं, सभी मेरे लिए 4 प्रमुख शून्य के साथ पैड बनाने के लिए काम कर रहे हैं :)

declare @number int =  1;
print right('0000' + cast(@number as varchar(4)) , 4)
print right('0000' + convert(varchar(4), @number) , 4)
print right(replicate('0',4) + convert(varchar(4), @number) , 4)
print  cast(replace(str(@number,4),' ','0')as char(4))
print format(@number,'0000')

इसमें सभी आवश्यक विकल्पों को शामिल किया गया है। धन्यवाद।
क्युरिच

6

दूसरा तरीका, सिर्फ पूर्णता के लिए।

DECLARE @empNumber INT = 7123
SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)

या, आपकी क्वेरी के अनुसार

SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID) 
         AS EmployeeCode
FROM dbo.RequestItems
WHERE ID=0

@ jp2code - आपको स्टैकऑवरफ्लो क्या है, इस पर पढ़ने की जरूरत है - इसका सहयोग विकी की तरह किया गया है - जैसे ही आपने इसे पोस्ट किया है, यह आपका सवाल नहीं है! सामान्य रूप से संपादित की जाने वाली चीजें अग्रिम और खराब व्याकरण / पूंजीकरण में धन्यवाद की तरह अत्यधिक "फुलाना" होती हैं।
यामीक


4

स्वच्छ के रूप में यह मिल सकता है और चर के साथ की जगह दे सकता है:

Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems
WHERE ID=0

यदि EmployeeIDस्तंभ को परिभाषित किया गया है, intतो + ऑपरेटर को संघनन के बजाय जोड़ के रूप में माना जाएगा और इसलिए शून्य खो जाएगा। का उपयोग करने convertसे इस समस्या से बचा जा सकेगा।

कॉलिंग REPLICATE ('0', 6) टाइप करने से बचने के लिए '000000' सिर्फ बेकार है ;-)
Mladen Mihajlovic

3
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems 
WHERE ID=0

2
SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0

ओह। दरअसल, यह मुझे 7135.0तब दिया जब मैंने इसे दिया 7135
jp2code

1

समाधान सभी शून्य संस्करणों के लिए अग्रणी शून्य के साथ हस्ताक्षरित / नकारात्मक संख्याओं के लिए काम करता है:

DECLARE
    @n money = -3,
    @length tinyint = 15,
    @decimals tinyint = 0

SELECT REPLICATE('-', CHARINDEX('-', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), '-', ''), ' ', '0')

1

सबसे सरल हमेशा सबसे अच्छा होता है:

Select EmployeeID*1 as EmployeeID 

-1

SQL के अपने संस्करण में मैं REPLICATE का उपयोग नहीं कर सकता। तो मैंने ऐसा किया:

SELECT 
    CONCAT(REPEAT('0', 6-LENGTH(emplyeeID)), emplyeeID) AS emplyeeID 
FROM 
    dbo.RequestItems`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.