关于sql server:从SQL语句的字段中删除前导零

关于sql server:从SQL语句的字段中删除前导零

Removing leading zeroes from a field in a SQL statement

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

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


1
SELECT SUBSTRING(ColumnName, patindex('%[^0]%',ColumnName), 10)

1
SELECT REPLACE(ltrim(REPLACE(ColumnName,'0',' ')),' ','0')


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

1
2
3
4
5
6
SELECT
    CASE
        WHEN LEFT(COLUMN,1) = '0'
        THEN RIGHT(COLUMN, (len(COLUMN)-1))
        ELSE COLUMN
      END

1
2
3
SELECT SUBSTRING(SUBSTRING('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20),
    patindex('%[^0]%',SUBSTRING('B10000N0Z', patindex('%[0]%','B10000N0Z'),
    20)), 20)

返回N0Z,也就是说,将除去前导零和之前的零。


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

1
2
3
4
5
SELECT CASE
      WHEN ColumnName = SUBSTRING(ColumnName, patindex('%[^0]%',ColumnName), 10)
       THEN '0'
      ELSE SUBSTRING(ColumnName, patindex('%[^0]%',ColumnName), 10)
      END

您可以使用此:

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
2
3
4
5
6
7
8
9
10
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

或者您可以简单地致电

1
CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10))

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


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


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

1
SELECT REPLACE(LEFT(CONVERT(nvarchar,GETDATE(),101),2),'0','')+RIGHT(CONVERT(nvarchar,GETDATE(),101),8)

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


1
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可以解决该问题。

我还没有测试速度


1
2
3
4
5
SELECT CASE
         WHEN TRY_CONVERT(BIGINT,Mtrl_Nbr) = 0
           THEN ''
           ELSE SUBSTRING(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END

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

案件

1
2
3
4
5
6
7
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

结束


1
2
3
4
5
SELECT ltrim('000045', '0') FROM dual;

LTRIM
-----
45

这应该做。


推荐阅读