【问题标题】:Removing leading zeroes from a field in a SQL statement从 SQL 语句中的字段中删除前导零
【发布时间】:2010-09-10 15:54:42
【问题描述】:

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

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

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

【讨论】:

  • 当字符串完全由“0”组成时会出现问题,因为它永远不会匹配非“0”字符。
  • 是的。在这种情况下,它将返回所有未修改的零字符串。如果这是一个问题,则必须针对零测试 patindex 的返回值。
  • @Zapnologica:不。您必须将其放入“update TableName set ColumnName = ...”语句中。
  • 当然,如果您使用更新语句。
  • 在使用此解决方案之前,请尝试查看 Arvo 的回答 posted here
【解决方案2】:

如果您希望查询返回 0 而不是一串零或任何其他值,您可以将其转换为这样的 case 语句:

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

【讨论】:

    【解决方案3】:
    select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
    

    【讨论】:

    • 我收到“替换函数需要 3 个参数”。我相信它应该是 select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
    • 如果值中有空格,这将失败。示例:“0001 B”应该变成“1 B”,但会变成“10B”。
    • 就像@Omaer 提到的那样,如果字符串中有一些空格,这是不安全的。改进的解决方案 - 首先用不太可能进入输入的字符替换空格,然后在 0-ltrim 之后将这些字符恢复为空格。最后看起来相当复杂 :( 示例:select replace(replace(ltrim(replace(replace('000309933200,00 USD', ' ', '|'),'0',' ')),' ','0 '), '|', ' ') --> 309933200,00 美元
    【解决方案4】:
    select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
        patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
        20)), 20)
    

    返回N0Z,也就是说,将去掉前导零和前面的任何内容。

    【讨论】:

    • 如果前面有东西,它怎么是前导0?
    【解决方案5】:

    从以下语句中删除前导 0 肯定会起作用。

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

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

    【讨论】:

    • 这究竟是如何回答这个问题的?
    【解决方案6】:
    select ltrim('000045', '0') from dual;
    
    LTRIM
    -----
    45
    

    应该这样做。

    【讨论】:

    • sql server 没有过载。
    • 在 PostgreSQL 中写select trim(leading '0' from '001A'); 就足够了,但是 OP 要求的是 SQL Server。
    【解决方案7】:

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

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

    【讨论】:

    • 仅适用于单个零,发帖人要求提供复数零
    【解决方案8】:

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

    案例

    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 个零也不是动态的。
    【解决方案9】:

    你可以用这个:

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

    【讨论】:

      【解决方案10】:
      select CASE
               WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
                 THEN ''
                 ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
             END
      

      【讨论】:

      • 你应该用你的答案给出解释,而不仅仅是一个代码sn-p。另外,请将代码格式化为代码(文本输入框顶部有一个按钮)。
      【解决方案11】:

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

      【讨论】:

      • 这将删除 0 而与它的位置无关。问题只询问领先的。
      【解决方案12】:

      您可以试试这个 - 它需要特别注意在需要时删除前导零:

      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)) 
      

      【讨论】:

        【解决方案13】:

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

        【讨论】:

        • '1A' * 1 等于什么?
        • 10*1 会是什么?
        • 问题中说列类型是VARCHAR(10),所以不能相乘。
        【解决方案14】:

        这是从字符串中删除前导零的 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
        

        【讨论】:

          【解决方案15】:

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

          您可以考虑使用 STUFF 命令。

          这是一个如何工作的示例。

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

          在 fiddler 中查看它将涵盖的各种场景

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-09
            • 2018-06-16
            相关资源
            最近更新 更多