首页 > 解决方案 > 删除以“。”分隔的每个部分的前导零 除了当“.0”。

问题描述

在 TSQL 中,我需要创建一个脚本来删除 '.' 之间的所有前导零,从字符串中的第一个 0 开始,除非有 '.0'。任务编号中间的任何位置。当任务号没有 EX: 111.0.123.234 时,我到目前为止做得很好,但我似乎无法弄清楚 SUBSTRING/CHARINDEX/PATINDEX 等的组合来删除所有前导零,除非零是唯一的'.' 之间的数字 请参阅随附的屏幕截图和脚本/部分结果作为示例。

这是我的脚本:

SELECT TASKPRODUCTID, (CASE WHEN TASKPRODUCTID NOT LIKE '%.0.%' THEN
REPLACE(LTRIM(REPLACE(TASKPRODUCTID,'0','')),' ','0') ELSE 
SUBSTRING(TASKPRODUCTID, PATINDEX('%[^0 ]%', TASKPRODUCTID + ' '),  LEN(TASKPRODUCTID))
END) AS NewTaskProductID
FROM TASK

这是部分结果集:

TASKPRODUCTID                        NewTaskProductID
003.007.002.001                      3.7.2.1
003.007.002.003                      3.7.2.3
004.003.003.008.0.2017275.132925     4.003.003.008.0.2017275.132925
004.005.001.003                      4.5.1.3
004.005.004.004.0.2017275.135139     4.005.004.004.0.2017275.135139
004.005.007.005.0.2017275.140304     4.005.007.005.0.2017275.140304
002.001.002                          2.1.2
002.004                              2.4
016.010                              16.1

屏幕截图 突出显示的行中的前导零示例在下一个小数部分仍然有前导零

谢谢!!

标签: leading-zero

解决方案


您可以尝试使用STUFF()来获取 .0。在其他情况下

declare @s AS varchar(100) = '0010.0.005.006025'

print stuff(REPLACE(LTRIM(REPLACE(@s,'0','0')),'0','*'), 
 patindex('%.*.%',REPLACE(LTRIM(REPLACE(@s,'0','0')),'0','*')), 3,'.-.')

输出

**1*.-.**5.**6*25

现在将此视为第一种情况;唯一的区别是我们得到了 '*' 而不是 '0'


推荐阅读