104

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

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

4

15 回答 15

162
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
于 2008-09-18T13:07:56.460 回答
28
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
于 2012-08-15T23:51:09.137 回答
5
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

Returns N0Z,也就是说,将摆脱前导零和任何出现在它们之前的东西。

于 2012-08-17T19:58:23.197 回答
5

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

select 
    case 
        when left(column,1) = '0' 
        then right(column, (len(column)-1)) 
        else column 
      end
于 2014-11-13T13:23:55.737 回答
4

你可以使用这个:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')
于 2016-04-18T08:49:14.853 回答
3

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

select CASE
      WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
       THEN '0'
      ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
      END
于 2010-12-21T23:25:29.877 回答
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)) 
于 2018-02-01T06:10:08.927 回答
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
于 2019-01-31T06:38:57.880 回答
0

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

您可以考虑使用 STUFF 命令。

这是它如何工作的示例。

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

在提琴手中查看它将涵盖的各种场景

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

于 2020-03-05T23:41:07.620 回答
-1

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

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

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

于 2014-04-08T13:55:21.660 回答
-2

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

于 2018-05-17T15:01:50.563 回答
-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 

结尾

于 2016-02-12T22:17:36.770 回答
-3
select CASE
         WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
           THEN ''
           ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END
于 2016-11-29T14:14:05.487 回答
-3

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

于 2018-01-10T01:40:12.997 回答
-5
select ltrim('000045', '0') from dual;

LTRIM
-----
45

这应该做。

于 2014-08-20T08:14:49.717 回答