尝试组合ParseName函数和Replace函数

时间:2017-11-08 20:50:44

标签: sql sql-server-2008

我今天把下面的剧本放在一起。

SELECT ParseName(Replace([SrcID], '|', '.'), 1) As [F1],
ParseName(Replace([SrcID], '|', '.'), 2) As [F2],
ParseName(Replace([SrcID], '|', '.'), 3) As [F3],
ParseName(Replace([SrcID], '|', '.'), 4) As [F4],
ParseName(Replace([SrcID], '|', '.'), 5) As [F5],
ParseName(Replace([SrcID], '|', '.'), 6) As [F6],
ParseName(Replace([SrcID], '|', '.'), 7) As [F7]
FROM [tbl_Raw_History]

起初我认为它有效,但现在我可以说它正在做一些我不太了解的事情。我最多可以在一个字符串中包含7个管道字符。出于某种原因,在找到第4个管道后,它将停止工作,并仅返回NULL。

我知道它无法确定,因为我有大约5k记录遵循这种模式:

TPOS|01|0|USD|I|SECU|US0642K|Jul 31 2017 12:00AM

查询中没有返回任何内容。我想在所有7个管道上解析表格,并将其与原始表格中的数据结合起来。所以,我想要名为'SrcID'的字段,以及名为'Position','TheDate'和其他几个字段的其他字段。我怎样才能做到这一点?我在SQL Server 2008上。

1 个答案:

答案 0 :(得分:1)

如果你还没有,那么有很多" splitstring"这里需要的功能可以自由使用。

但是如果你想要一种特定的蛮力方法,这可能会起到作用。尽管在更大的样本上测试它。

SQL Fiddle

MS SQL Server 2014架构设置

CREATE TABLE tbl_Raw_History
    ( ID int identity(1,1) primary key,
      [SrcID] varchar(80))
;

INSERT INTO tbl_Raw_History
    ([SrcID])
VALUES
    ('TPOS|01|0|USD|I|SECU|US0642K|Jul 31 2017 12:00AM')
;

查询1

select
*
from tbl_Raw_History
cross apply (
  select
     charindex('|',SrcID) 
   , charindex('|',SrcID,charindex('|',SrcID)+1)
   , charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID)+1)+1)
   , charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID)+1)+1)+1)
   , charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID)+1)+1)+1)+1)
   , charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID)+1)+1)+1)+1)+1)
   , charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID,charindex('|',SrcID)+1)+1)+1)+1)+1)+1)
) p (p1,p2,p3,p4,p5,p6,p7)
cross apply (
  select
      substring(SrcID,1,p1-1)
    , substring(SrcID,p1+1,p2-p1-1)
    , substring(SrcID,p2+1,p3-p2-1)
    , substring(SrcID,p3+1,p4-p3-1)
    , substring(SrcID,p4+1,p5-p4-1)
    , substring(SrcID,p5+1,p6-p5-1)
    , substring(SrcID,p6+1,p7-p6-1)
    , substring(SrcID,p7+1,len(SrcID))
  ) s (s1,s2,s3,s4,s5,s6,s7,s8)

<强> Results

| ID |                                            SrcID | p1 | p2 | p3 | p4 | p5 | p6 | p7 |   s1 | s2 | s3 |  s4 | s5 |   s6 |      s7 |                  s8 |
|----|--------------------------------------------------|----|----|----|----|----|----|----|------|----|----|-----|----|------|---------|---------------------|
|  1 | TPOS|01|0|USD|I|SECU|US0642K|Jul 31 2017 12:00AM |  5 |  8 | 10 | 14 | 16 | 21 | 29 | TPOS | 01 |  0 | USD |  I | SECU | US0642K | Jul 31 2017 12:00AM |

NB :可以访问第一个交叉申请的列别名p1 ... p7,就好像第二个交叉中的列名称适用。