টি-এসকিউএল-এ প্যাড লেফট ফাংশন


113

আমার নীচের টেবিল এ:

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

আমি দ্বিতীয় উদাহরণটিতে সিনট্যাক্স পরীক্ষা করিনি have আমি নিশ্চিত না যে এটি যদি 100% কাজ করে - তবে এটির জন্য কিছু টুইটের প্রয়োজন হতে পারে - তবে এটি আপনার পছন্দসই আউটপুট কীভাবে পাবেন তা সাধারণ ধারণা দেয় con

সম্পাদনা

মন্তব্যে তালিকাবদ্ধ উদ্বেগ মোকাবেলায় ...

@ pkr298 - হ্যাঁ এসটিআর কেবল সংখ্যাগুলিতে কাজ করে ... ওপি'র ক্ষেত্রটি একটি আইডি ... সুতরাং কেবল সংখ্যা।

@ ডিজোলেটর - অবশ্যই এটি কাজ করবে না ... প্রথম প্যারামিটারটি 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
এসআরটি () কেবল সংখ্যাগুলিতে (বা স্ট্রিং ক্ষেত্রে ক্ষেত্রগুলিতে সংখ্যা) কাজ করে। এই কোডটি যদি আপনি কোনও ভার্চর ক্ষেত্রে ব্যবহার করছেন তবে আপনার একটি নম্বর আছে বলে ধরে নেওয়া হচ্ছে তবে রেকর্ডগুলির একটিতে খারাপ (অ-সংখ্যাযুক্ত) ডেটা রয়েছে। এই ক্ষেত্রে রাইট () ফাংশনটি ভাঙ্গবে না।
pkr298

1
সংখ্যাটি বেশি দৈর্ঘ্যের হলে ( STR(123456, 4)****

2
@ ডিজোলেটর আমি একটি প্রতিক্রিয়া যোগ করেছি এবং আপনার যোগ করা দৃশ্যের সুবিধার্থে ঠিক করেছি।
প্যাট্রিক 13

66

এসকিউএল সার্ভার এখন সংস্করণ 2012 থেকে শুরু করে ফর্ম্যাট ফাংশন সমর্থন করে , তাই:

SELECT FORMAT(id, '0000') FROM TableA

কৌতুক করবে

যদি আপনার আইডি বা কলামটি একটিতে থাকে varcharএবং কোনও সংখ্যার প্রতিনিধিত্ব করে আপনি প্রথমে রূপান্তর করেন:

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

চতুর এবং সহজ, ধন্যবাদ! মূল প্রশ্নের তারিখ দেওয়া, এটি এখন সরকারী উত্তর হওয়া উচিত;)
ডেভিড গন্ডসন

1
আইডি যদি একটি স্ট্রিং হয় তবে আপনি এটিকে প্রথমে পূর্ণসংখ্যায় রূপান্তর করতে পারেন - ফর্ম্যাট নির্বাচন করুন (রূপান্তর (int, id), '0000')
ক্রিমসনকিং

দুঃখিত তবে আমি ডাউনটি দিয়েছি কারণ এই উপায়টি খুব ধীর। 90 টি সারি বেশি চালাতে পুরো চার সেকেন্ড সময় নিয়েছে, যখন গৃহীত উত্তরটি তাত্ক্ষণিক ছিল। এটি একটি খুব বড় নেতিবাচক দিক এবং ফরমেটটি কেবলমাত্র এক বা দুটি রেকর্ডে ব্যবহার করা উচিত, সর্বোচ্চ। অন্যথায় এটি খুব খারাপ পারফরম্যান্সের কারণে এটি অকেজো।
শ্যাডো উইজার্ড আপনার পক্ষে কান

@ শ্যাডো উইজার্ড আমি ফর্ম্যাট ব্যবহার করে সারিগুলির সংখ্যা সহ তাত্ক্ষণিক পারফরম্যান্সটি দেখছি।
জনিএইচকে

@ জোহনিএইচকে ভালভাবে টেবিল ডিজাইন বা অন্য ডিবি বোকার মতো কিছু থাকতে পারে, তবে এখনও ... সত্য যে আমার পক্ষে এটি অন্যদিকে দ্রুত ছিল যখন সত্যিই ধীর ছিল।
শ্যাডো উইজার্ড আপনার পক্ষে


43

পুরানো পোস্ট, তবে এটি কাউকে সাহায্য করতে পারে:

এটি 4 টি অবৈধ অক্ষর দিয়ে শেষ না হওয়া পর্যন্ত শেষ করতে:

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

10 অবধি সম্পূর্ণ করতে:

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

কলামটি যদি সংখ্যাসূচক হয় তবে এটিকে প্রথমে এ জাতীয় কোড সহ ভারচরতে রূপান্তর করুন:

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

এবং একটি সংখ্যাসূচক ক্ষেত্র সহ 10 পর্যন্ত শেষ করতে:

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

1
@ সিলভার এম-এ, কোনও সংখ্যার আগে 0 স যুক্ত করার কোনও উপযোগিতা নেই, যেহেতু এগুলি যেভাবেই উপেক্ষা করা হবে (0003 সর্বোপরি 3)। সম্ভবত আপনি যা সম্পাদন করতে চান তা হ'ল a সংখ্যাটিকে একটি স্ট্রিংয়ে (বার্চর) কাস্ট করা এবং তারপরে উপরের স্টেটমেন্টটি ব্যবহার করুন।
মার্সেলো মায়ারা

1
@ সিলভার এম-এ, যদি এটি হয় তবে কেবল "CAST" কমান্ডটি ব্যবহার করুন যেমন: নির্বাচন করুন রাইট ('0000000000' + CAST (বর্ণমুক্ত হিসাবে COLUMNNAME), 10) ট্যাবলেট থেকে; এইটাই কি সেইটা?
মার্সেলো মায়ারা

@ মার্সেলোম্যারা এটি কেবল একটি মন্তব্য নয়, উত্তরের অংশ হওয়া উচিত। আমি এখন যুক্ত।
শ্যাডো উইজার্ড আপনার পক্ষে

দ্রষ্টব্য: এটি সর্বাধিক দক্ষ উত্তর, কোনও অভিনব ফাংশন সহ যা সত্যিই ধীর হতে পারে with অতএব আমি এটি অতিরিক্ত অনুগ্রহ দিয়েছি।
শ্যাডো উইজার্ড আপনার পক্ষে

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

যদি এখনও কেউ আগ্রহী হন তবে আমি এই নিবন্ধটি
ডেটাব্যাসে পেয়েছি UID গাইড: এসকিউএল সার্ভারে বাম প্যাডিং - 3 এলপিএডি () সমতুল্য

সংক্ষেপে, নিবন্ধে উল্লেখ করা হয়েছে 3 পদ্ধতি।
আসুন আপনার আইডি = 12 বলুন এবং আপনার এটি 0012 হিসাবে প্রদর্শিত হবে।

পদ্ধতি 1 -
রাইট () ফাংশনটি ব্যবহার করুন প্রথম পদ্ধতিটি কিছু শীর্ষস্থানীয় জিরো যুক্ত করার পরে স্ট্রিংয়ের ডানদিকের অংশটি ফিরিয়ে আনতে RIGHT () ফাংশনটি ব্যবহার করে।

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

ফলাফল:
0012

পদ্ধতি 2 - রাইটের সংমিশ্রণটি ব্যবহার করুন () এবং প্রতিলিপি ()
এই পদ্ধতিটি প্রায় আগের পদ্ধতির মতোই, কেবলমাত্র পার্থক্য হ'ল আমি কেবল তিনটি শূন্যকে প্রতিস্থাপন () ফাংশন দিয়ে প্রতিস্থাপন করি:

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

এসকিউএল সার্ভারে একটি ফাংশনে আমার এটি দরকার ছিল এবং প্যাট্রিকের উত্তরটি কিছুটা সামঞ্জস্য করে।

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

আমার সমাধানটি দক্ষ নয় তবে এমন পরিস্থিতিতে আমাকে সহায়তা করেছে যেখানে মানগুলি (ব্যাংক চেক নম্বর এবং তারের স্থানান্তর রেফ নং) ভারচার হিসাবে সঞ্চিত ছিল যেখানে কিছু এন্ট্রিগুলির সাথে আলফা সংখ্যাসূচক মান ছিল এবং দৈর্ঘ্য cha অক্ষরের চেয়ে কম হলে আমাকে প্যাড করতে হয়েছিল।

কেউ একই পরিস্থিতি জুড়ে আসে যদি ভাগ করে নেওয়ার চিন্তা

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