代码之家  ›  专栏  ›  技术社区  ›  Tim C

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

  •  86
  • Tim C  · 技术社区  · 16 年前

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

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

    15 回复  |  直到 16 年前
        1
  •  134
  •   Ian Horwill    16 年前
    select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
    
        2
  •  21
  •   Ben    11 年前
    select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
    
        3
  •  4
  •   Taryn Frank Pearson    12 年前
    select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
        patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
        20)), 20)
    

    收益率 N0Z 也就是说,将去掉前导零和它们前面的任何零。

        4
  •  3
  •   AHiggins    9 年前

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

    select 
        case 
            when left(column,1) = '0' 
            then right(column, (len(column)-1)) 
            else column 
          end
    
        5
  •  2
  •   Ben    11 年前

    如果您希望查询返回一个0而不是一个由零或任何其他值组成的字符串,您可以将其转换为case语句,如下所示:

    select CASE
          WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
           THEN '0'
          ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
          END
    
        6
  •  0
  •   Misa Lazovic Francisco Balam    8 年前

    您可以使用:

    SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')
    
        7
  •  0
  •   rsenna    7 年前

    你可以试试这个-它需要特别注意 只有 如果需要,请删除前导零:

    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)) 
    
        8
  •  0
  •   Krin    6 年前

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

        9
  •  0
  •   Vikas    6 年前

    下面是从字符串中删除前导零的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
    
        10
  •  -1
  •   Kritner    9 年前

    从下一个月的报表中删除前导的0肯定有效。

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

    只是替换 GETDATE() 表的日期字段。

        11
  •  -1
  •   Madhurupa Moitra    7 年前

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

        12
  •  -1
  •   Bacon    6 年前
    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将解决tha问题。T问题。

    我还没有测试过速度

        13
  •  -3
  •   user3809240    10 年前
    select ltrim('000045', '0') from dual;
    
    LTRIM
    -----
    45
    

    这是应该的。

        14
  •  -3
  •   Brian Ellison    9 年前

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

    案例

    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 
    

    结束

        15
  •  -3
  •   rink.attendant.6    8 年前
    select CASE
             WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
               THEN ''
               ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
           END