我今天把下面的剧本放在一起。
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上。
答案 0 :(得分:1)
如果你还没有,那么有很多" splitstring"这里需要的功能可以自由使用。
但是如果你想要一种特定的蛮力方法,这可能会起到作用。尽管在更大的样本上测试它。
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,就好像第二个交叉中的列名称适用。