শীর্ষস্থানীয় শূন্যগুলির সাথে একটি স্ট্রিং প্যাড করুন যাতে এটি এসকিউএল সার্ভার ২০০৮-এর তিনটি অক্ষর দীর্ঘ


398

আমার কাছে একটি স্ট্রিং রয়েছে যা এসকিউএল সার্ভার ২০০৮ আর 2 এ প্রথম তৈরি হওয়ার পরে 3 অক্ষর পর্যন্ত দীর্ঘ হয়।

আমি এটি শীর্ষস্থানীয় শূন্যগুলির সাথে প্যাড করতে চাই, সুতরাং যদি এর আসল মান '1' হয় তবে নতুন মানটি হবে '001'। অথবা এর আসল মান যদি '23 'হয় তবে নতুন মানটি' 023 '। বা এর আসল মান যদি '124' হয় তবে নতুন মানটি মূল মানের সমান।

আমি এসকিউএল সার্ভার 2008 আর 2 ব্যবহার করছি। আমি টি-এসকিউএল ব্যবহার করে এটি কীভাবে করব?



উত্তর:


681

যদি ক্ষেত্রটি ইতিমধ্যে একটি স্ট্রিং থাকে তবে এটি কাজ করবে

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

আপনি যদি নালুকে '000' হিসাবে দেখান চান

এটি একটি পূর্ণসংখ্যা হতে পারে - তবে আপনি চান

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

প্রশ্নের প্রয়োজন অনুসারে এই উত্তরটি কেবল তখনই কাজ করে যদি দৈর্ঘ্য <= 3, আপনি যদি আরও বড় কিছু চান তবে আপনার স্ট্রিং ধ্রুবক এবং দুটি পূর্ণসংখ্যার ধ্রুবক প্রস্থে পরিবর্তন করতে হবে। যেমন'0000' and VARCHAR(4)),4


8
আমার একটি চরের ()) ক্ষেত্র ছিল যা হাতে গোনা কয়েকটা মান ছিল যা কেবলমাত্র ২-৩ অক্ষর দীর্ঘ এবং উপরেরটি আমার পক্ষে কাজ করে না। এটি কাজ করার জন্য আমাকে '000000' + ইসনুল (ফিল্ড, '') এর চারপাশে একটি আরটিআরআইএম যুক্ত করতে হয়েছিল।
ডিওয়াইনার

3
হোগান হ্যাঁ আমি এটি পেয়েছি, তবে যতক্ষণ না স্ট্রিংটি এটি কাজ করে না, আমি কেন একটু ব্যস্ত তা জানতে পেরেছি তবে এর সংক্ষিপ্তসারটি হ'ল আমার CHAR (6) ক্ষেত্রটি কেবল সঠিক ('000000) করছে '+ ইসনুল (ক্ষেত্র,' '),)) কাজ করে নি তবে রাইট (আরটিআরআইএম (' 000000 '+ ইসনুল (ক্ষেত্র,' '))),)) করেছে।
ডিওয়াইনার

2
ওহ আমি বুঝতে পারি, আপনার স্ট্রিং হিসাবে এনকোড করা একটি সংখ্যার ডানদিকে ফাঁকা জায়গা ছিল।
হোগান

3
@ ডায়েঞ্জার আপনি এই আচরণটি পেয়েছেন কারণ একটি চর একটি নির্দিষ্ট দৈর্ঘ্যের ডেটা টাইপ, সুতরাং আপনার ক্ষেত্রে চর (6) এর অর্থ 6 টি অক্ষর দীর্ঘ। যদি আপনার আসল মান 6 টিরও কম হয় তবে এটিকে ডানদিকে ফাঁকা দিয়ে প্যাড করা হবে যাতে প্রস্তাবিত উত্তরটি একটি চরের (6) এর জন্য ফলাফলের ফলাফল করবে।
জিয়ানিস প্যারাস্কেভোপল্লোস

2
@ হোগান, হ্যাঁ, তবে এই প্রশ্নটি শীর্ষস্থানীয় গুগলের ফলাফল হিসাবে "স্কয়ারের শীর্ষস্থানীয় শূন্যগুলি যোগ করবে", সুতরাং আমি মনে করি এটি অনেক লোকের জন্য উপযোগী হবে (যারা স্ক্ল্যাসারভার ব্যবহার করেন না, তবে গুগল এই প্রশ্নটি রাখেন) তা জানতে হবে যে অন্যান্য ডাটাবেসে এলপিডের অধিক কনফিয়েন্ট ফাংশন বিদ্যমান। যাহোক তোমাকে ধন্যবাদ.
ডায়রালিক

142

যদিও প্রশ্নটি এসকিউএল সার্ভার ২০০৮ আর -2-এর জন্য ছিল, যদি কেউ 2012 এবং ততোধিক সংস্করণ সহ এটিকে পড়ছে, তখন থেকে এটি ফর্ম্যাট ব্যবহার করে আরও সহজ হয়ে গেছে ।

আপনি হয় একটি আদর্শ সংখ্যামূলক ফর্ম্যাট স্ট্রিং বা স্বনির্ধারিত সংখ্যার বিন্যাসের স্ট্রিংটি বিন্যাস আর্গুমেন্ট হিসাবে পাস করতে পারেন ( এই ইঙ্গিতটির জন্য ভাদিম ওভচিনিকভকে ধন্যবাদ জানাই )।

এই প্রশ্নের জন্য উদাহরণস্বরূপ একটি কোড

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 # 'এর পরিবর্তে' D3 'ব্যবহার করতে পারেন।
ভাদিম ওভচিনিকভ

1
এটি গৃহীত উত্তরের চেয়ে যথেষ্ট ধীর বলে মনে হচ্ছে তবে প্রচুর পরিমাণে ডেটা নিয়ে কাজ না করা খুব সহজ
রুট

2
যদিও এটি অযৌক্তিক বলে মনে হয়, তবে এটি লক্ষণীয় যে ফর্ম্যাটটি কেবল সংখ্যাসূচক এবং তারিখের ধরণের সাথে কাজ করে, বর্ণের সাথে নয়।
strattonn

120

নিরাপদ পদ্ধতি:

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

এতে '***'এন <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
@ স্টেনপেট্রভ, আপনাকে ধন্যবাদ আপনি যা অর্জন করার চেষ্টা করছেন তার উপর এটি নির্ভর করে। বৃহত্তর, বাস্তব-বিশ্ব উত্পাদন ডেটাবেসে নির্ভর করার জন্য আমি যে জিনিসটি শিখেছি তা হ'ল এক ধরণের বা অন্যরকমের খারাপ ডেটার উপস্থিতি। এবং আমি সম্ভবত 3 টি এএম ফোন কলগুলি এড়াতে পছন্দ করি যদি আমি সম্ভব করতে পারি; ^)
নিকোলাস কেরি

:) এখনও যখন 3 এএম কল আসে তখন আমি 10 টি জটিলের চেয়ে 1 টি সাধারণ লাইন পড়তে পারি। ভেরিয়েবল যুক্ত করা বিষয়টিকে আরও খারাপ করে তোলে, বিশেষত যদি অন্য দলের সদস্যরা ফ্লাইতে তাদের গণনা করার সিদ্ধান্ত নিয়েছে এবং অ-নেতিবাচক @ প্রশস্ততা পরীক্ষা না করে ...
স্টেন পেট্রোভ

এই যুক্ত হওয়া ভেরিয়েবলগুলি কেবলমাত্র সাধারণীকরণের জন্য - আপনি মানগুলি হার্ড কোড করতে পারেন। একটি লাইনারের জন্য, আপনি একটি স্কেলার ফাংশন তৈরি করতে পারেন - তারপরে আপনার একটি লাইনার থাকে।
জেরার্ড ওনিল

30

আমি এসকিউএল সার্ভার এক্সপ্রেস 2012 এ হোগানের উত্তরের একটি বৈকল্পিক যা এখানে ব্যবহার করি:

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

ক্ষেত্রটি যদি স্ট্রিং হয় বা না হয় তা উদ্বেগের পরিবর্তে, আমি এটি ঠিক CONCATকরি, যেহেতু এটি কোনও স্ট্রিং আউটপুট দেবে। ক্ষেত্রটিতে কোনও হতে পারে উপরন্তু যদি NULLব্যবহার ISNULLফাংশন পেয়ে এড়াতে প্রয়োজন হতে পারে NULLফলাফল নেই।

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

1
যতদূর আমি মনে করি কনক্যাট কেবল মানটিকে উপেক্ষা করে যদি এটি নাল হয় তাই প্রথমটি ভাল কাজ করে।
মেরি

ক্ষেত্রের লেন নির্বিশেষে এই সমাধানটি কাজ করবে
আনবাউন্ড

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;যা সালারের প্রথম উদাহরণটি উপরে দেয়। ধন্যবাদ সালার
জেফ মার্জারার 0

উপরে আমার মন্তব্যে একটি টাইপ রয়েছে, এটি পড়তে হবে: DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 10 - LEN(@NumStr)) + @NumStr;যা 0000002016উপরের প্রথম উদাহরণে ফিরে আসে ।
জেফ মার্লেগার

@ জেফমার্গলার - সংখ্যা এবং স্ট্রিংয়ে এটি কীভাবে কাজ করে? এটি একটি ফাংশন যা পূর্ণসংখ্যা পরামিতি নেয়। প্রশ্ন ছিল স্ট্রিং সম্পর্কে।
হোগান

5

যারা এখানে তাদের বিদ্যমান ডেটা আপডেট করতে চান তাদের জন্য ক্যোয়ারী হ'ল:

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

3

পূর্ণসংখ্যার জন্য আপনি ইন্টি থেকে বার্চারে অন্তর্নিহিত রূপান্তর ব্যবহার করতে পারেন:

SELECT RIGHT(1000 + field, 3)

4
তবে, এটি যথেষ্ট পরিমাণে বড় মূল্য দেওয়া ব্যর্থ হবে, আরও নেতিবাচক মানগুলির জন্য, আপনি ... আকর্ষণীয় ফলাফল পাবেন।
নিকোলাস কেরি

3

আমি এটির পুরানো টিকিটটি জানি আমি কেবল এটি ভাগ করে নেওয়ার চিন্তা করেছি।

আমি এই কোডটি সমাধানের সন্ধানে পেয়েছি। এটি এমএসএসকিউএল এর এমএসএসকিউএল 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

আমার যখন স্থির আকারের ভার্চার (বা স্ট্রিং) আউটপুট প্রয়োজন তখন ইনপুট হিসাবে পূর্ণসংখ্যা কলামে আমার একই সমস্যা ছিল। উদাহরণস্বরূপ, 1 থেকে '01', 12 থেকে '12'। এই কোডটি কাজ করে:

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

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


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) পর্যন্ত প্রয়োজনীয়তা ছিল। ইনপুটটিতে প্যাডিংয়ের প্রয়োজন হলে কেবলমাত্র বাম প্যাডগুলি কেবলমাত্র @ পেটার দিয়েই প্যাড করুন। সর্বদা @ প্যাটার্নে সংজ্ঞায়িত দৈর্ঘ্য ফিরিয়ে দেওয়া উচিত।

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

1234 ইনপুট ফেরত দেয়



0

আমি এসকিউএল সার্ভার ২০০৮-এ তারিখগুলি DATETIMEOFFSET এ রূপান্তর করার জন্য কীভাবে আমার টাইমজোন অফসেটকে একটি টাইমজোন স্ট্রিংয়ে রূপান্তর করতে পারি তা নির্দিষ্ট করে এখানে কাজ করার জন্য এসেছি G মোট, তবে প্রয়োজনীয়।

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