根据分隔符解析列值

时间:2010-10-21 21:55:44

标签: sql sql-server parsing ssis delimiter

以下是我的数据示例:

ABC * 12345ABC
BCD * 234()
CDE * 3456789(安培;(安培;
DEF * 4567A * B * C

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

12345
234个
3456789个
4567

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

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

我该如何做到这一点?

编辑:

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

XWZ * A12345%$%

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

A12345

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

你可以用一点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

答案 1 :(得分:0)

如果忽略这是在SQL中,那么首先想到的是Regex:

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

捕获组应该得到你想要的东西。我不知道SQL是否具有正则表达式函数。