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

问题描述 投票:95回答:16

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

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

sql sql-server tsql
16个回答
146
投票
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

-1
投票

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

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

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


-1
投票

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


-1
投票

要删除开头的0,您可以将数字列乘以1例如:选择(ColumnName * 1)


-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
投票
select ltrim('000045', '0') from dual;

LTRIM
-----
45

这应该做。


-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 

END


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

24
投票
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')

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

返回N0Z,也就是说,将去除前导零和它们之前的所有内容。


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
投票

您可以尝试此操作-需要特别注意only删除前导零:

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

0
投票

如果要从大小未知的字符串中删除前导零。

您可以考虑使用STUFF命令。

这里是如何工作的示例。

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

在提琴手中查看它将涵盖的各种情况

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

© www.soinside.com 2019 - 2024. All rights reserved.