112

I am working on a SQL query that reads from a SQLServer database to produce an extract file. One of the requirements to remove the leading zeroes from a particular field, which is a simple VARCHAR(10) field. So, for example, if the field contains '00001A', the SELECT statement needs to return the data as '1A'.

Is there a way in SQL to easily remove the leading zeroes in this way? I know there is an RTRIM function, but this seems only to remove spaces.

1

16 Answers 16

169
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
Sign up to request clarification or add additional context in comments.

6 Comments

This will have problems when the string is entirely made up of "0", since it will never match a non-"0" character.
True. It will return all the unmodified string of zeros in this case. If this is a problem, the return value of patindex will have to be tested against zero.
@Zapnologica: No. You'd have to put it in an "update TableName set ColumnName = ..." statement.
Sure, if you use Update Statements.
Before using this solution, please try to look into Arvo's answer posted here
|
35
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0') 

3 Comments

I received "Replace function requires 3 arguments." I believe it should read select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
This will fail if the value has a space in it. Example: "0001 B" should become "1 B" but will become "10B" instead.
Like @Omaer mentioned, this is not safe if there are some spaces in string. Improved solution - first replace spaces with char that is unlikely to get in input, and after 0-ltrim, restore back these chars to spaces after. In the end looks quite complex :( Example: select replace(replace(ltrim(replace(replace('000309933200,00 USD', ' ', '|'),'0',' ')),' ','0'), '|', ' ') --> 309933200,00 USD
12

You can use this:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0') 

1 Comment

ey brother you nailed it..! a very single code that works!
6

I had the same need and used this:

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

1 Comment

only works for a single zero, the poster asked for plural zeroes
5
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20)), 20) 

returns N0Z, that is, will get rid of leading zeroes and anything that comes before them.

1 Comment

How is it a leading 0 if something comes before it?
3

If you want the query to return a 0 instead of a string of zeroes or any other value for that matter you can turn this into a case statement like this:

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

Comments

1

In case you want to remove the leading zeros from a string with a unknown size.

You may consider using the STUFF command.

Here is an example of how it would work.

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

See in fiddler various scenarios it will cover

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

Comments

0

You can try this - it takes special care to only remove leading zeroes if needed:

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 

Or you can simply call

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

1 Comment

The question needs to remove the leading zeros for 000000001A, both of your answers drops the A
0

Here is the SQL scalar value function that removes leading zeros from string:

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 

1 Comment

I'd try to avoid RBAR, personally: devonblog.com/continuous-delivery/…
0

On SQL Server 2017 (14.x), TRIM supports removing characters other than spaces using TRIM ( [ characters FROM ] string )

Starting with SQL Server version 2022 (16.x), the TRIM function supports the additional LEADING|TRAILING|BOTH options TRIM ( [ LEADING | TRAILING | BOTH ] [characters FROM ] string )

declare @string nvarchar(max) = '00001A'; select @string as [string] , trim(leading '0' from @string) as [trim (leading '0' from @string)] --- Needs SQL Server 2022 (16.x) or later , trim( '0' from @string) as [trim ('0' from @string)] --- Needs SQL Server 2017 (14.x) or later 

Keep in mind that prior to the 2022 version, TRIM will remove specified character(s) from both sides of the string, so TRIM ('0' from '0000A1000') will result in A1

Source: learn.microsoft.com

Comments

-1

To remove the leading 0 from month following statement will definitely work.

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

Just Replace GETDATE() with the date field of your Table.

1 Comment

How exactly does this answer the question?
-1

To remove leading 0, You can multiply number column with 1 Eg: Select (ColumnName * 1)

3 Comments

What does '1A' * 1 equal?
what does 10*1 will be ?
It was stated in the question that the column type is VARCHAR(10), therefore multiplying is not possible.
-3
select CASE WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0 THEN '' ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18) END 

1 Comment

You should give explanation with your answers, not just a single code snippet. Also, please format code as code (there's a button along the top of the text-entry box).
-3

you can try this SELECT REPLACE(columnname,'0','') FROM table

1 Comment

This will remove 0 irrespective of its position. Question is asking about only leading ones.
-4

I borrowed from ideas above. This is neither fast nor elegant. but it is accurate.

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 

END

1 Comment

It's also not dynamic to allow for more than 3 zeroes.
-5
select ltrim('000045', '0') from dual; LTRIM ----- 45 

This should do.

2 Comments

There is no overload for sql server.
In PostgreSQL it is enought to write select trim(leading '0' from '001A');, but OP was asking for SQL Server.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.