删除前导零第2部分

时间:2016-11-03 20:49:44

标签: sql sql-server function tsql leading-zero

SQL Server 2012

我的表中有3列将使用函数。 ' [USR] [Udf_OverPunch]&#39 ;.和子串。

这是我的代码:

[usr].[Udf_OverPunch](SUBSTRING(col001, 184, 11)) as REPORTED_GAP_DISCOUNT_PREVIOUS_AMOUNT

此功能适用于我需要它做的事情。它基本上是根据数据字典将符号或字母转换为指定的数字。

我遇到的问题是有前导零。我刚刚问了一些关于前导零的问题,但它不允许我使用函数列来执行它,因为符号无法转换为int。

这是我用来摆脱其他列的代码中的前导零(但保留一个零):

cast(cast(SUBSTRING(col001, 217, 6) as int) as varchar(25)) as PREVIOUS_REPORTING_PERIOD

这很适合转换'000000'的值。只有一个' 0' 0或者值为&00; 000060'到' 60'但由于符号或字母(尝试转换为int时)不能使用该函数。

正如我所提到的,我有3列产生的值在没有使用该函数时看起来像这样:

'0000019753{'
'0000019748G'
'0000019763H'

我的目标是在删除前导零的同时使用该函数(除非它们全部为零然后保持为零)。

这是我尝试过的,因为该值包含的字符不是整数:

[usr].[Udf_OverPunch]cast(cast(SUBSTRING(col001, 184, 6) as int) as varchar(25)) as REPORTED_GAP_DISCOUNT_PREVIOUS_AMOUNT,

如果您有任何想法或需要更多信息,请与我们联系。 :)

3 个答案:

答案 0 :(得分:1)

select      case when col like '%[^0]%' then substring(col,patindex('%[^0]%',col),len(col)) when col like '%0%' then '0' else col end   

from        tab

select      case when col like '%[^0]%' then right(col,len(ltrim(replace(col,'0',' ')))) when col like '%0%' then '0' else col end

from        tab

答案 1 :(得分:0)

我正在使用T-SQL CLR函数处理此类替换,该函数允许使用正则表达式进行替换。所以,解决方案将是这样的:

/imports

您需要创建此类函数,因为[dbo].[fn_Utils_RegexReplace] ([value], '^0{1,}(?=.)', '') (内置)中没有正则表达式支持。

special directories

例如:

How to create regex replace function in T-SQL?

答案 2 :(得分:0)

试试这个,

declare @i varchar(50)='0000019753}'--'0000019753'

select case when ISNUMERIC(@i)=1 then 
cast(cast(@i as bigint) as varchar(50)) else @i end

[usr].[Udf_OverPunch]( case when ISNUMERIC(col001)=1 then 
cast(cast(col001 as bigint) as varchar(50)) else col001 end)