【问题标题】:SQL Server : function to trim only leading zero'sSQL Server:仅修剪前导零的功能
【发布时间】:2017-04-03 20:32:52
【问题描述】:

我必须创建一个修剪前导零的函数。然而,它比仅仅摆脱第一个零要复杂一些。

几个例子和结果:

  • QZ0106 应该变成:QZ106
  • 0108 应该变成:108
  • 00000B0108 应该变成:B0108
  • 011B%000407A0001!应该变成:11B%000407A0001!

我自己构建了一个查询并提出了以下内容

 RETURN LEFT(@input, PATINDEX('%0%', @input)-1) + 
 SUBSTRING(SUBSTRING(@input, PATINDEX('%0%',@input), LEN(@input)), PATINDEX('%[^0]%', SUBSTRING(@input,PATINDEX('%0%',@input),LEN(@input))),len(@input))

现在,这对获得上述结果非常有效。

但是:

ZBET108 应该保留 ZBET108. - 上面的查询返回 ZBET18

我无法让它工作。查询应该找到第一个数字字符串并修剪它的前导零。现在似乎要做的是搜索第一个零并将其删除。

有人可以帮我吗?

非常感谢各位。

【问题讨论】:

  • 我建议您使用WHILE 循环。虽然可能有一种方法可以通过字符串匹配来完成此操作,但WHILE 可能是工作代码的最快路径。
  • 如果整个字符串中唯一的数字是一个零,你想做什么?
  • @SteveLovell 那么零应该保留而不被修剪。这在 Gordon Linoff 的查询中似乎很有效。但是,ZBET000000 应该变成 ZBET0。有没有办法做到这一点?

标签: sql sql-server function stored-procedures


【解决方案1】:

认为这可能有效:

RETURN (CASE WHEN LEFT(@input, CHARINDEX('0', @input)-1) LIKE '%[0-9]%'
             THEN @input
             ELSE LEFT(@input, CHARINDEX('0', @input)-1) + 
 SUBSTRING(SUBSTRING(@input, PATINDEX('%0%',@input), LEN(@input)), PATINDEX('%[^0]%', SUBSTRING(@input,PATINDEX('%0%',@input),LEN(@input))),len(@input))
        END)

这只是检查第一个 0 是字符串中的第一个数字。

【讨论】:

  • 非常感谢,这确实很棒!有什么办法可以添加以下内容:ZBET000000 应该变成 ZBET0。有没有办法做到这一点?
  • 我在 WHEN 语句中添加了以下内容: WHEN @input LIKE '%0%' THEN replace(rtrim(replace(convert(char,@input),'0',' ') ),' ',0) + '0' 这工作正常,但与其他的如 '00000A0106000' 混淆 --Result: 'A0106000' 它应该在哪里:A0106
  • @ocaj90 。 . .我想你想要@input like '%[^0-9]0%' and @input not like '%[^0-9]0%[^0]%'
猜你喜欢
  • 2010-10-14
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多