2008-09-18 164 views
76

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

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

+2

作为给予好评大卫沃克的http://stackoverflow.com/a/11129399: - 如果需要,它需要特别注意删除前导零/ 1635441响应,请参考阿尔沃的回答发布: http://stackoverflow.com/a/662437/1635441 – ramizmoh 2013-01-31 12:43:27

回答

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

这将有问题时,字符串完全由“0”组成,因为它永远不会匹配一个non- “0”字符。 – 2009-03-19 14:09:29

+0

是的。在这种情况下,它将返回所有未修改的零串。如果这是一个问题,patindex的返回值将不得不针对零进行测试。 – 2009-04-20 09:26:54

+0

不错。谢谢 – VISQL 2012-06-02 00:35:49

2

如果您想查询返回一个0,而不是零的字符串或任何其他数值为此事,你可以变成一个case语句这个像这样的:

select CASE 
     WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
     THEN '0' 
     ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
     END 
22
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0') 
4
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20) 

返回N0Z,也就是说,将摆脱前导零和前面的任何东西。

-1

若要从月份以后的声明中删除前导0肯定会起作用。

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

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

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

LTRIM 
----- 
45 

这应该做。

3

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

select 
    case 
     when left(column,1) = '0' 
     then right(column, (len(column)-1)) 
     else column 
     end 
-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 

END

0

您可以使用此:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0') 
-3
select CASE 
     WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0 
      THEN '' 
      ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18) 
     END 
0

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

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