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

时间:2008-09-18 12:31:05

标签: sql sql-server tsql

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

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

16 个答案:

答案 0 :(得分:140)

select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

答案 1 :(得分:23)

select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')

答案 2 :(得分:4)

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

返回N0Z,即将摆脱前导零和它们之前的任何内容。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

我有同样的需要并使用它:

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

答案 5 :(得分:1)

您可以使用:

1-5

答案 6 :(得分: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)) 

答案 7 :(得分:0)

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

答案 8 :(得分: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

答案 9 :(得分:0)

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

您可以考虑使用STUFF命令。

这是它如何工作的一个例子。

Stored initial: Optional([red, blue, green])
Retrieved after storing purple: Optional([red, blue, purple])
Retrieved before manipulation: ["red", "blue", "purple"]
Retrieved after storing yellow Optional([yellow, blue, purple])

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

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

答案 10 :(得分:-1)

要从月份后面删除前导0,肯定会有效。

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

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

答案 11 :(得分:-1)

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

答案 12 :(得分:-2)

# Some useful devcon examples:
#devcon.exe classes             # to list all available classes
#devcon.exe listclass net
#devcon.exe hwids =net
#devcon.exe driverfiles "HID\Vid_045e&Pid_0039&Rev_0121"
#devcon.exe find "*usb*"
#devcon.exe find "=libusb-win32 devices"
#devcon.exe hwids USB\*

# devcon.exe listclass usb

Listing 11 devices in setup class "USB" (Universal Serial Bus controllers).
USB\VID_0BDA&PID_0139\20100201396000000                     : Realtek USB 2.0 Card Reader
USB\ROOT_HUB20\4&29650814&0                                 : USB Root Hub
USB\VID_8087&PID_8008\5&55A390B&0&1                         : Generic USB Hub
...
PCI\VEN_8086&DEV_8C2D&SUBSYS_11CD1043&REV_05\3&11583659&0&D0:  
Intel(R) 8 Series/C220 Series USB EHCI #2 - 8C2D

# devcon.exe hwids USB\*

USB\VID_0BDA&PID_0139\20100201396000000
    Name: Realtek USB 2.0 Card Reader
    Hardware IDs:
        USB\VID_0BDA&PID_0139&REV_3960
        USB\VID_0BDA&PID_0139
    Compatible IDs:
        USB\Class_FF&SubClass_06&Prot_50
        USB\Class_FF&SubClass_06
        USB\Class_FF
USB\ROOT_HUB20\4&29650814&0
    Name: USB Root Hub
    Hardware IDs:
        USB\ROOT_HUB20&VID8086&PID8C26&REV0005
        USB\ROOT_HUB20&VID8086&PID8C26
        USB\ROOT_HUB20
...

这是一个Sql脚本,用于模拟2017年之前的tsql中TRIM命令的功能,它与其他建议基本相同,但是其他替换为一个仍然会出现的单个不常见字符“ [Rtrim]”或'[Ltrim]'仍可能出现在文本中,但是用唯一的文本替换hat,例如Guid可以解决该问题。

我还没有测试速度

答案 13 :(得分:-3)

select ltrim('000045', '0') from dual;

LTRIM
-----
45

应该这样做。

答案 14 :(得分:-3)

我借鉴了上述想法。这既不快也不优雅。但这很准确。

CASE

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)

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