1

SQL Server 2012

我的表中有 3 列将使用一个函数。'[usr].[Udf_OverPunch]'。和子串。

这是我的代码:

[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' 或将 '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,

如果您有任何想法或需要更多信息,请告诉我。:)

4

3 回答 3

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
于 2016-11-03T22:30:12.237 回答
0

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

[dbo].[fn_Utils_RegexReplace] ([value], '^0{1,}(?=.)', '')

T-SQL您需要创建这样的函数,因为(内置)中没有正则表达式支持。

如何在 T-SQL 中创建正则表达式替换函数?

例如:

在此处输入图像描述

于 2016-11-04T07:59:36.543 回答
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)
于 2016-11-04T09:21:39.663 回答