Reputation: 70648
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.
Upvotes: 112
Views: 387096
Reputation: 35
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
Upvotes: 0
Reputation: 343
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
Upvotes: 1
Reputation: 24332
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
Upvotes: 0
Reputation: 21
To remove leading 0, You can multiply number column with 1 Eg: Select (ColumnName * 1)
Upvotes: -1
Reputation: 71
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))
Upvotes: 0
Reputation: 15
you can try this
SELECT REPLACE(columnname,'0','') FROM table
Upvotes: -3
Reputation: 1
select CASE
WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
THEN ''
ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
END
Upvotes: -3
Reputation: 129
You can use this:
SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')
Upvotes: 12
Reputation: 1
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
Upvotes: -4
Reputation: 9
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.
Upvotes: -1
Reputation: 61
I had the same need and used this:
select
case
when left(column,1) = '0'
then right(column, (len(column)-1))
else column
end
Upvotes: 6
Reputation: 93
select ltrim('000045', '0') from dual;
LTRIM
-----
45
This should do.
Upvotes: -5
Reputation: 31
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
Upvotes: 3
Reputation: 51
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.
Upvotes: 5
Reputation: 3025
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
Upvotes: 169