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,
如果您有任何想法或需要更多信息,请与我们联系。 :)
答案 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,}(?=.)', '')
(内置)中没有正则表达式支持。
例如:
答案 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)