2017-07-29 112 views
2

我遇到需要帮助的问题。我有一列由“。”分隔的一组字符串。 (下面的例子)我有查询通过使用子字符串和charindex拆分它的问题是第二个分隔符不总是相同的长度,所以当我的情况下,它不是正确分裂。以分隔符分隔的列中拆分记录

Column A 
100.11111.12.16 
101.36333 
101.REMOTE.01 
200.ACTIVE 

我需要将上面的数据分成3列。

Column A   Column B  Column C  Column D 
100.11111.12.16 100   11111   12.16 
101.36333   101   36333 
101.REMOTE.01  101   REMOTE   01 
200.ACTIVE   200   ACTIVE 

正如你所看到的,第二个分隔符并不总是处于相同的位置。第一个总是在3之后,所以我可以分割它,但是第二个分裂的问题是我找不到确切的位置。

回答

1

对于这个解决方案必须了解ISNULL功能。 SUBSTRING,NULLIF,CHARINDEX函数的链接早先由受人尊敬的@P版本给出。 LEN功能本身就说明了一切。

SELECT a [Column A], 
    SUBSTRING(a, 1, ISNULL(p1 - 1, LEN(a))) [Column B], 
    SUBSTRING(a, p1 + 1, ISNULL(p2, LEN(a) + 1) - p1 - 1) [Column C], 
    SUBSTRING(a, p2 + 1, LEN(a) - p2) [Column D] 
FROM(VALUES('100.11111.12.16'), 
      ('101.36333'), 
      ('101.REMOTE.01'), 
      ('200.ACTIVE'), 
      ('42170')) a(a) 
CROSS APPLY(VALUES(NULLIF(CHARINDEX('.', a), 0))) b(p1) 
CROSS APPLY(VALUES(NULLIF(CHARINDEX('.', a, p1 + 1), 0))) c(p2) 
CROSS APPLY(VALUES(NULLIF(CHARINDEX('.', a, p2 + 1), 0))) d(p3); 

检查它在rextester.com

+0

谢谢你的进一步解释 – Veebster

3

这里使用的一种方式字符串函数

SELECT [Column A] = t.string, 
     [Column B] = LEFT(t.string, Charindex('.', t.string) - 1), 
     [Column C] = Reverse(Parsename(Reverse(cs.string), 1)), 
     [Column D] = Stuff(cs.string, 1, NULLIF(fpos, 0), '') 
FROM Yourtable t 
     CROSS apply(VALUES (Substring(string, Charindex('.', string) + 1, Len(string))))cs(string) 
     CROSS apply(VALUES (Charindex('.', cs.string))) p (fpos) 

MSDN链接:

+0

谢谢!这真的帮助我 – Veebster

2

与CROSS音乐会使用小XML另一种选择APPLY

实施例

Declare @YourTable Table ([Column A] varchar(50)) 
Insert Into @YourTable Values 
('100.11111.12.16') 
,('101.36333') 
,('101.REMOTE.01') 
,('200.ACTIVE') 

Select A.* 
     ,[Column B] = B.Pos1 
     ,[Column C] = B.Pos2 
     ,[Column D] = substring(concat('.'+B.Pos3,'.'+B.Pos4),2,50) 
From @YourTable A 
Cross Apply (
       Select Pos1 = xDim.value('/x[1]','varchar(max)') 
         ,Pos2 = xDim.value('/x[2]','varchar(max)') 
         ,Pos3 = xDim.value('/x[3]','varchar(max)') 
         ,Pos4 = xDim.value('/x[4]','varchar(max)') 
       From (Select Cast('<x>' + replace(A.[Column A],'.','</x><x>')+'</x>' as xml) as xDim) as X 
      ) B 

返回

enter image description here

0

如果点的最大事件是3,那么PARSENAME可以做所有的工作:

select columnA, 
     parsename(reverse(columnA),1) columnB, 
     parsename(reverse(columnA),2) columnC, 
     parsename(reverse(columnA),3) + isnull('.'+parsename(reverse(columnA),4),'') columnD 
from table