【问题标题】:Parse column value based on delimeters根据分隔符解析列值
【发布时间】:2010-10-21 21:55:44
【问题描述】:

这是我的数据示例:

ABC*12345ABC
BCD*234()
CDE*3456789(&(&
DEF*4567A*B*C

使用 SQL Server 2008 或 SSIS,我需要解析这些数据并返回以下结果:

12345
234
3456789
4567

如您所见,星号 (*) 是我的第一个分隔符。第二个“分隔符”(我用这个词很宽松)是数字序列停止时。

所以,基本上,只需抓住星号后面的数字序列...

我怎样才能做到这一点?

编辑:

我在原来的帖子中犯了一个错误。另一个可能值的示例是:

XWZ*A12345%$%

在这种情况下,我想返回以下内容:

A12345

该值可以以字母字符开头,但始终以数字结尾。因此,抓住星号之后的所有内容,但在序列中的最后一个数字处停止。

对此的任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server parsing ssis delimiter


    【解决方案1】:

    你可以用一点 patindexcharindex 技巧来做到这一点,比如:

    ; with YourTable(col1) as 
            (
            select 'ABC*12345ABC'
            union all select 'BCD*234()'
            union all select 'CDE*3456789(&(&'
            union all select 'DEF*4567A*B*C'
            union all select 'XWZ*A12345%$%'
            )
    select  left(AfterStar, len(Leader) + PATINDEX('%[^0-9]%', AfterLeader) - 1)
    from    (
            select  RIGHT(AfterStar, len(AfterStar) - PATINDEX('%[0-9]%', AfterStar) + 1) 
                        as AfterLeader
            ,       LEFT(AfterStar, PATINDEX('%[0-9]%', AfterStar) - 1) as Leader
            ,       AfterStar
            from    (
                    select  RIGHT(col1, len(col1) - CHARINDEX('*', col1)) as AfterStar
                    from    YourTable
                    ) as Sub1
            ) as Sub2
    

    打印出来:

    12345
    234
    3456789
    4567
    A12345
    

    【讨论】:

    • 嗨 Andomar,我在原始帖子中犯了一个错误。你介意看看我的编辑,看看你能不能帮忙?
    • @Robert:答案已编辑,带有子查询,因此更容易阅读
    【解决方案2】:

    如果你忽略了这是在 SQL 中,那么首先想到的是正则表达式:

    ^.*\*(.*[0-9])[^0-9]*$
    

    那里的捕获组应该得到你想要的。不知道SQL有没有正则函数。

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多