从SQL语句中的字段中删除前导零


98

我正在处理从SQLServer数据库读取以生成提取文件的SQL查询。从特定字段(最简单的VARCHAR(10)字段)中删除前导零的要求之一。因此,例如,如果该字段包含“ 00001A”,则SELECT语句需要将数据返回为“ 1A”。

SQL中是否可以通过这种方式轻松删除前导零?我知道有一个RTRIM功能,但这似乎只能删除空格。


3
作为对大卫·沃克的stackoverflow.com/a/11129399/1635441回应的支持,请参阅Arvo发布的答案:stackoverflow.com/a/662437/1635441
ramizmoh 2013年

Answers:


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

8
当字符串完全由“ 0”组成时,这将有问题,因为它永远不会匹配非“ 0”字符。
Cade Roux

真正。在这种情况下,它将返回所有未修改的零字符串。如果存在问题,则必须将patindex的返回值测试为零。
伊恩·霍威

@Zapnologica:否。您必须将其放在“ update TableName set ColumnName = ...”语句中。
伊恩·霍威

当然,如果您使用更新语句。
Srivastav

1
在使用此解决方案之前,请尝试查看此处发布的
OscarSosa

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

我收到“替换函数需要3个参数。” 我认为它应该显示为select replace(ltrim(replace(ColumnName,'0','')),'','0')
brentlightsey 2013年

5
如果值中有空格,将失败。示例:“ 0001 B”应变为“ 1 B”,但应改为“ 10B”。
奥马尔2014年

1
就像提到的@Omaer一样,如果字符串中有一些空格,这是不安全的。改进的解决方案-首先用不太可能在输入中获得的char替换空格,然后在0-ltrim之后,将这些char还原回空格。最后看起来很复杂:(例子:select replace(replace(ltrim(replace(replace('000309933200,00 USD','','|'),'0',''))),'','0 '),'|','')-> 309933200,00 USD
Robert

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

return N0Z,也就是说,将除去前导零和之前的任何零。


5
如果先于零,前导0怎么算?
xxbbcc 2014年

4

我有同样的需求,并使用了这个:

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

3

如果您希望查询返回0而不是零或任何其他值,则可以将其转换为case语句,如下所示:

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

2

您可以使用此:

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

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

这是从字符串中删除前导零的SQL标量值函数:

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

从下个月的声明中删除前导0肯定是可行的。

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

只需替换GETDATE()为表格的日期字段即可。


3
这究竟如何回答这个问题?
deutschZuid 2014年

-2

你可以试试这个 SELECT REPLACE(columnname,'0','') FROM table


3
这将删除0,无论其位置如何。问题只问领导者。
Sunil

-2

要删除前导0,可以将数字列乘以1例如:选择(ColumnName * 1)


3
'1A'* 1等于多少?
乔纳森·赖斯

10 * 1是多少?
RATAN KUMAR

问题中指出,列类型为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

这是一个Sql脚本,用于模拟2017年之前的tsql中TRIM命令的功能,它与其他建议基本相同,但其他替换为单个仍不常见的字符'[Rtrim]'或'[ Ltrim]'仍可能出现在文本中,但是用唯一的文本替换hat,例如Guid可以解决该问题。

我还没有测试速度


-3

我从上面的想法中借鉴了。这既不快速也不优雅。但这是准确的。

案件

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个零也是动态的。
JoeFletch

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

1
您应该给出答案的解释,而不仅仅是一个代码段。另外,请将代码格式化为代码(文本输入框顶部有一个按钮)。
David Heyman

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

LTRIM
-----
45

这应该做。


2
sql server没有过载。
BillRob 2014年

在PostgreSQL中编写就足够了select trim(leading '0' from '001A');,但是OP要求使用SQL Server。
y434y
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.