এসকিউএল সার্ভারে নেতৃস্থানীয় শূন্যগুলির সাথে প্যাডিং করে সংখ্যার ফর্ম্যাট করা


119

আমাদের কাছে একটি পুরাতন এসকিউএল টেবিল রয়েছে যা এসকিউএল সার্ভার 2000 দ্বারা প্রায় 10 বছর ব্যবহার করা হয়েছিল।

এটা, আমাদের কর্মচারী ব্যাজ নম্বর সংরক্ষণ করা হয় char(6)থেকে 000001থেকে 999999

আমি এখন একটি ওয়েব অ্যাপ্লিকেশন লিখছি, এবং আমার কর্মচারী ব্যাজ নম্বর সংরক্ষণ করতে হবে।

আমার নতুন টেবিল, আমি ছোট কাটা লাগতে পারে এবং পুরানো টেবিল অনুলিপি করা যায়, কিন্তু আমি ভাল ডেটা ট্রান্সফার, ছোট সাইজ, ইত্যাদি জন্য আশা করছি কেবল মজুত করে intথেকে মানগুলি 1করতে 999999

সি # তে, আমি 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?
ওডে

2
এসকিউএল সার্ভার ২০১২ এর অবশেষেFORMAT সি # :-)
মারক_স

1
@ ওডেন: intমানগুলি উল্লেখযোগ্যভাবে কম স্থান গ্রহণ করে char(6), এবং প্রতি অংশে এইগুলি একত্রিত হয় যা উত্পাদিত হয়। দক্ষতা.
jp2code

আপনি কোনও সমস্যায় পড়ার আগে আপনি কি অপ্টিমাইজ করছেন?
ওডে

4
আসুন দেখুন, আপনার এক মিলিয়ন ব্যাজ নম্বর রয়েছে এবং আপনি অনুমান করেছেন যে আপনি DATALENGTH()প্রতিটিতে দুটি বাইট সংরক্ষণ করতে পারেন (অনুযায়ী )। যেহেতু কলামটি কোনও সূচীতে থাকতে পারে তাই আপনি 2 এমবি-র বেশি সঞ্চয় করতে পারবেন। এবং অন্যান্য কলামগুলির সাথে যুক্ত করা হয়েছে যে 2 বাইট প্রতি সারি 4KB পৃষ্ঠা সংরক্ষণ করার জন্য যথেষ্ট পরিমাণে একটি সারির দৈর্ঘ্য হ্রাস করতে পারে। এটি কি কোনও মোবাইল প্ল্যাটফর্মে হোস্ট করা যাচ্ছে, বা আপনি অনুন্নত অঞ্চলে আপনার মনোযোগ কেন্দ্রীভূত করতে পারেন?
HABO

উত্তর:


172

আপনার মোট দৈর্ঘ্যের যেটি হওয়া দরকার তা 6 নম্বর পরিবর্তন করুন:

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

কলামটি যদি একটি আইএনটি হয় তবে আপনি আরটিআরআইএমকে স্পষ্টভাবে একটি ভ্রচারে রূপান্তর করতে ব্যবহার করতে পারেন

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

এবং এই 0 টি মুছে ফেলার জন্য কোড এবং 'আসল' নম্বরটি ফিরে পেতে:

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

1
এমনকি আপনি কীভাবে 0 টি সরিয়ে ফেলবেন তাও আমাকে দেখিয়েছেন! আমাকে এটি পরীক্ষা করুন, এবং আমি এটি উত্তর হিসাবে চিহ্নিত করব।
jp2code

শূন্যগুলি অপসারণ করার জন্য আপনার কোডের দরকার নেই, কেবল নিয়োগ করুন বা কোনও রূপান্তর করুন এবং সেগুলি স্বয়ংক্রিয়ভাবে সরানো হবে।
জিম্বো

2
এটি কেবল তখনই কাজ করে যদি পাস করা মানটি স্ট্রিং হয়, আপনি যদি একটি পূর্ণসংখ্যা পাস করেন তবে আপনি যে মানটি পাশ করেছেন সেই একই মানটি বেরিয়ে
আসবেন

2
যদিও এর পুরানো ... "+ কর্মচারী" এর পরিবর্তে "+ রূপান্তর (বারচার, কর্মচারী)" ব্যবহার করা
ইন্টি

3
কর্মচারী 6 টির বেশি সংখ্যক না হলে এটি নল ফলাফলের কারণ না হলে এটি একটি ভাল উপায়। যোগাযোগের কার্যটির উত্তরটি হ'ল: নির্বাচন করুন নির্বাচন করুন ('0', 6-লেন (কনভার্ট (বার্তা, কর্মচারী))), কর্মচারী)
মাহমুদ মোরাভেজ

125

কেবল ফরমেট ফাংশনটি ব্যবহার করুন (এসকিউএল সার্ভার ২০১২ বা আরও নতুনতে কাজ করে):

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

তথ্যসূত্র: http://msdn.microsoft.com/en-us/library/hh213505.aspx


1
এটি একটি পুরানো প্রশ্ন - এসকিউএল সার্ভার 2012 প্রকাশের আগে।
jp2code

19
তবুও, আমি এখন এই বুদ্বুদটিকে শীর্ষের কাছাকাছি দেখতে চাই।
ডেভ হেইনস

4
শুধু ক্ষেত্রে যদি কেউ অবাক হয়। Formatডেটা টাইপ সংরক্ষণ করে না তবে পুরোপুরি ন্যভাড়াচরে রূপান্তরিত হয়:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
র‌্যাল্ফ

2
এই উপায়টি সবচেয়ে সহজ এবং আইএমএইচওর সেরা সমাধান।
রবার্ট লুজো

আপনি যদি এটি বড় ডেটাसेट
এএমডি এর

33

আপনি এই পদ্ধতিতে আপনার পদ্ধতি পরিবর্তন করতে পারেন

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

তবে এটি ধরে নিয়েছে যে আপনার EmployeeIDএকটি সাংখ্যিক মান এবং এই কোডটি ফলাফলটিকে স্ট্রিংয়ে পরিবর্তন করে, আমি আবার মূল সংখ্যাটির মান যুক্ত করার পরামর্শ দিই

সম্পাদনা অবশ্যই উপরের প্রশ্নটি আমি মনোযোগ সহকারে পড়িনি। এটি বলে যে ক্ষেত্রটি char(6)তাই এমপ্লয়াইড একটি সংখ্যার মান নয়। যদিও এই উত্তরটির এখনও প্রতি মূল্য রয়েছে, এটি উপরের প্রশ্নের সঠিক উত্তর নয়।


এটি আমার মনে হয় এটি করার সবচেয়ে পরিষ্কার উপায়। ধন্যবাদ
iheartcsharp

এটা কি '000000'সত্যিই প্রয়োজনীয় ..? '0'ভাল কাজ করছে। এটি কি কেবল একটি 0 ব্যবহার করা নিরাপদ?
শাশ্বত

1
ওপি ফলাফল হিসাবে 6 টি চর দৈর্ঘ্যের স্ট্রিং চেয়েছিল। বিশেষত যদি কর্মচারী 7135 হয় তবে এই ক্যোয়ারীটি 007135 এ ফিরে আসা উচিত । শুধুমাত্র একটি '0' ব্যবহার করে ফেরত পাওয়া যায় 07135না 007135। পুরো ধারণাটি সমস্ত 0স্ট্রিং রূপান্তরিত কর্মচারী সমন্বয়ে গঠিত 6 টি চর স্ট্রিংয়ের সাথে সংযুক্ত করা , তারপরে ডান প্রান্ত থেকে শুরু করে 6 টি অক্ষর নেওয়া। আইডিটি যে দৈর্ঘ্যের উপরের পদ্ধতিটি হ'ল সর্বদা একটি স্ট্রিং 6 টি দৈর্ঘ্যের দৈর্ঘ্যে পৌঁছানোর জন্য প্রয়োজনীয় শূন্য চরের সংখ্যা সহ স্ট্রিং দেয়
স্টিভ

এটিতে 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করলে এই সমস্যা এড়ানো যাবে।

'000000' টাইপ করা এড়াতে REPLICATE ('0', 6) এ কল করা কেবল অপচয় নয় ;-)
ম্লাদেন মিহাজলভিক


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 
    CONCAT(REPEAT('0', 6-LENGTH(emplyeeID)), emplyeeID) AS emplyeeID 
FROM 
    dbo.RequestItems`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.