2017-07-29 173 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