একটি এসকিউএল বিবৃতিতে ক্ষেত্র থেকে নেতৃস্থানীয় জিরোগুলি সরিয়ে ফেলা হচ্ছে


100

আমি একটি এসকিউএল ক্যোয়ারীতে কাজ করছি যা একটি এসকিউএল সার্ভার ডাটাবেস থেকে একটি এক্সট্র্যাক্ট ফাইল তৈরির জন্য পড়ে। একটি নির্দিষ্ট ক্ষেত্র থেকে নেতৃস্থানীয় শূন্যস্থানগুলি সরানোর প্রয়োজনীয়তার একটি, যা একটি সাধারণ VARCHAR(10)ক্ষেত্র। সুতরাং, উদাহরণস্বরূপ, যদি ক্ষেত্রটিতে '00001A' থাকে, তবে নির্বাচনের বিবৃতিতে '1A' হিসাবে ডেটা ফেরানো দরকার।

এসকিউএল-তে কোনও উপায় আছে কীভাবে নেতৃস্থানীয় শূন্যগুলি সহজেই সরানো যায়? আমি জানি একটি RTRIMফাংশন রয়েছে তবে এটি কেবল স্থানগুলি সরিয়ে ফেলবে বলে মনে হয়।


4
ডেভিড ওয়াকার এর জন্য একটি ভোট দিন হিসাবে stackoverflow.com/a/11129399/1635441 প্রতিক্রিয়া, Arvo এর উত্তর পড়ুন দয়া পোস্ট stackoverflow.com/a/662437/1635441
ramizmoh

উত্তর:


152
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

8
স্ট্রিংটি পুরোপুরি "0" দিয়ে তৈরি হয়ে গেলে এটির সমস্যা হবে, কারণ এটি কখনই কোনও "0" অক্ষরের সাথে মেলে না।
ক্যাড রক্স

সত্য। এটি এক্ষেত্রে সমস্ত শিরোনামহীন স্ট্রিংটি ফিরিয়ে দেবে। এটি যদি সমস্যা হয় তবে প্যাটিনডেক্সের রিটার্ন মানটি শূন্যের বিপরীতে পরীক্ষা করতে হবে।
ইয়ান হরভিল

@ জাপানোলজিকা: না You আপনাকে এটি একটি "আপডেট টেবিলনেম সেট কলামনাম = ..." বিবৃতিতে রাখতে হবে।
আয়ান হরভিল

অবশ্যই, যদি আপনি আপডেট বিবৃতি ব্যবহার করেন।
শ্রীবাস্তব

4
এই সমাধানটি ব্যবহার করার আগে, দয়া করে এখানে পোস্ট করা
আরভোর

27
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')

আমি পেয়েছি "প্রতিস্থাপন ফাংশনটির জন্য 3 টি আর্গুমেন্ট প্রয়োজন" " আমি বিশ্বাস করি এটি নির্বাচন করুন প্রতিস্থাপন (ltrim (প্রতিস্থাপন (কলামনাম, '0', '')), '', '0')
পড়তে হবে

4
মানটির মধ্যে স্থান থাকলে এটি ব্যর্থ হবে। উদাহরণ: "0001 বি" "1 বি" হওয়া উচিত তবে পরিবর্তে "10 বি" হয়ে উঠবে।
ওমায়ের

4
@ ওমারের বর্ণিত মত, স্ট্রিংয়ের কিছু জায়গা থাকলে এটি নিরাপদ নয়। উন্নত সমাধান - প্রথমে চার্ট দিয়ে এমন স্থানগুলি প্রতিস্থাপন করুন যা ইনপুটটিতে আসার সম্ভাবনা নেই এবং 0-ltrim এর পরে এই অক্ষরগুলিকে স্পেসে পুনরুদ্ধার করুন। শেষের দিকে বেশ জটিল দেখাচ্ছে :( উদাহরণস্বরূপ: প্রতিস্থাপন (প্রতিস্থাপন (ltrim (প্রতিস্থাপন ('000309933200,00 মার্কিন ডলার', '', '|')), '0', '')), '', '0 নির্বাচন করুন '),' | ',' ') -> 309933200,00 মার্কিন ডলার
রবার্ট লুজো

5
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

প্রত্যাবর্তন N0Z, যা নেতৃস্থানীয় জিরো এবং তাদের সামনে উপস্থিত যে কোনও কিছু থেকে মুক্তি পাবে।


4
যদি কিছু আগে আসে তবে এটি কীভাবে শীর্ষস্থানীয় 0?
xxbbcc

4

আমার একই চাহিদা ছিল এবং এটি ব্যবহার করেছি:

select 
    case 
        when left(column,1) = '0' 
        then right(column, (len(column)-1)) 
        else column 
      end

3

আপনি যদি এই প্রশ্নের জন্য কোয়েরিকে শূন্যের স্ট্রিং বা অন্য কোনও মানের পরিবর্তে 0 ফিরিয়ে দিতে চান তবে আপনি এটিকে কেস স্টেটমেন্টে রূপান্তর করতে পারেন:

select CASE
      WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
       THEN '0'
      ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
      END


0

আপনি এটি চেষ্টা করে দেখতে পারেন - প্রয়োজনে কেবল নেতৃস্থানীয় শূন্যস্থানগুলি সরাতে এটি বিশেষ যত্ন নেয় :

DECLARE @LeadingZeros    VARCHAR(10) ='-000987000'

SET @LeadingZeros =
      CASE WHEN PATINDEX('%-0', @LeadingZeros) = 1   THEN 
           @LeadingZeros
      ELSE 
           CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
      END   

SELECT @LeadingZeros

অথবা আপনি কেবল কল করতে পারেন

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 

0

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

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Vikas Patel
-- Create date: 01/31/2019
-- Description: Remove leading zeros from string
-- =============================================
CREATE FUNCTION dbo.funRemoveLeadingZeros 
(
    -- Add the parameters for the function here
    @Input varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Result varchar(max)

    -- Add the T-SQL statements to compute the return value here
    SET @Result = @Input

    WHILE LEFT(@Result, 1) = '0'
    BEGIN
        SET @Result = SUBSTRING(@Result, 2, LEN(@Result) - 1)
    END

    -- Return the result of the function
    RETURN @Result

END
GO

0

আপনি যদি অজানা আকারের স্ট্রিং থেকে নেতৃস্থানীয় শূন্যগুলি সরাতে চান তবে।

আপনি STUFF কমান্ড ব্যবহার বিবেচনা করতে পারেন।

এটি কীভাবে কাজ করবে তার উদাহরণ এখানে।

SELECT ISNULL(STUFF(ColumnName
                   ,1
                   ,patindex('%[^0]%',ColumnName)-1
                   ,'')
             ,REPLACE(ColumnName,'0','')
             )

ফিডলারে দেখুন বিভিন্ন পরিস্থিতিতে এটি কভার করবে

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=14c2dca84aa28f2a7a1fac59c9412d48


-1

নিম্নলিখিত বিবৃতি থেকে শীর্ষস্থানীয় 0 অপসারণ নিশ্চিতভাবে কাজ করবে।

SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8) 

GETDATE()আপনার টেবিলের তারিখ ক্ষেত্রের সাথে কেবল প্রতিস্থাপন করুন ।


4
কিভাবে এই প্রশ্নের উত্তর দেয়?
DeutschZuid

-2

আপনি এটি চেষ্টা করতে পারেন SELECT REPLACE(columnname,'0','') FROM table


4
এটি 0 এর অবস্থান নির্বিশেষে 0 টি সরিয়ে ফেলবে। প্রশ্নটি কেবল শীর্ষস্থানীয়দের সম্পর্কেই জিজ্ঞাসা করছে।
সুনীল

-2

শীর্ষস্থানীয় 0 অপসারণ করতে, আপনি 1 টি দিয়ে সংখ্যা কলামকে গুণ করতে পারেন: নির্বাচন করুন (কলামনাম * 1)


4
'1A' * 1 সমান কি?
জোনাথন রাইস

10 * 1 কী হবে?
রতন কুমার

প্রশ্নে বলা হয়েছিল যে কলামের প্রকারটি VARCHAR (10), সুতরাং গুণ করা সম্ভব নয়।
y434y

-2
select replace(replace(rtrim(replace(replace(replace(replace(ltrim(replace(replace([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') As Result

এটি একটি এসকিএল স্ক্রিপ্ট যা 2017 এর আগে tsql তে টিআরআইএম কমান্ডের কার্যকারিতা অনুকরণ করে, এটি মূলত অন্যান্য রিকোমেন্ডেটিয়নের মতোই, তবে অন্যরা একটি একক অস্বাভাবিক চরিত্র দ্বারা প্রতিস্থাপন করে যা এখনও ঘটতে পারে, '[আর্ট্রিম]' বা '[ Ltrim] 'এখনও টেক্সটে ঘটতে পারে, তবে একটি অনন্য পাঠ্যের সাথে টুপি প্রতিস্থাপন করা উদাহরণস্বরূপ একজন গাইড এই সমস্যার সমাধান করতে পারে।

আমি গতি সম্পর্কিত এটি পরীক্ষা করেছি


-3

আমি উপরের ধারণা থেকে ধার নিয়েছি। এটি দ্রুত বা মার্জিত নয়। তবে এটি সঠিক।

CASE

WHEN left(column, 3) = '000' THEN right(column, (len(column)-3))

WHEN left(column, 2) = '00' THEN right(a.column, (len(column)-2))

WHEN left(column, 1) = '0' THEN right(a.column, (len(column)-1))

ELSE 

শেষ


3 টিরও বেশি শূন্যের জন্য অনুমতি দেওয়াও গতিশীল নয়।
জোফ্লেচ

-3
select CASE
         WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
           THEN ''
           ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END

4
আপনার উত্তরগুলির সাথে ব্যাখ্যা দেওয়া উচিত, কেবল একটি কোড স্নিপেট নয়। এছাড়াও, দয়া করে কোডটিকে কোড হিসাবে ফর্ম্যাট করুন (পাঠ্য-প্রবেশ বক্সের শীর্ষে একটি বোতাম আছে)।
ভিভিয়ান

-4
select ltrim('000045', '0') from dual;

LTRIM
-----
45

এটি করা উচিত।


4
স্কেল সার্ভারের জন্য কোনও ওভারলোড নেই।
বিলরব

PostgreSQL এ এটি লেখার জন্য ধারণা করা হয়েছে select trim(leading '0' from '001A');, তবে ওপি এসকিউএল সার্ভারের জন্য জিজ্ঞাসা করেছিল।
y434y
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.