【问题标题】:Removing Leading Zeros Part 2删除前导零第 2 部分
【发布时间】:2016-11-03 20:49:44
【问题描述】:

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”时效果很好,但由于符号或字母(当尝试转换为整数)。

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

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

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

这是我尝试的但不起作用,因为该值包含一个不是整数的字符:

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

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

【问题讨论】:

  • 在这里非常需要一些建议。这需要在明天之前完成。这是整个过程完成的唯一事情。
  • 我已经回答了您的问题,但是,根据您的数据,可能会有更清洁的解决方案。它总是相同的长度吗? is 总是由数字和 + 结尾的单个非数字字符组成?

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


【解决方案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

【讨论】:

  • 我无法让我的函数使用它。
  • @GregoryBrauninger - 这是经过测试的代码。能详细点吗?
  • @GregoryBrauninger,我对这些信息无能为力。你有错误吗?你会得到意想不到的结果吗?能给个示例字符串吗?
  • 我正在尝试正确格式化该评论。前导零并只留下一个零工作正常。问题是我的函数没有被执行,所以我只剩下:@Dudu '13962{' '17801H' '2969G'
  • 一切都很棒我只需要它来使用我的功能([usr].[Udf_OverPunch])。@Dude Markovitz
【解决方案2】:

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

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

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

How to create regex replace function in T-SQL?

例如:

【讨论】:

    【解决方案3】:

    试试这个,

    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)
    

    【讨论】:

    • [usr].[Udf_OverPunch](case when ISNUMERIC((SUBSTRING(col001, 206, 11))=1 then cast(cast((SUBSTRING(col001, 206, 11) as bigint) as varchar(50)) else (SUBSTRING(col001, 206, 11) end) as GAP_DISCOUNT_AMOUNT_THIS_PERIOD, 出现语法错误@kumarharsh
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2018-10-14
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多