2016-04-27 33 views
0

例子:拆分文本 - SQL服務器

|     Detail                    | 
|--------------------------------------------------------------------------------------------------------| 
| G31479 /1815 /1844 MOC MCZ 11/4/2015 0:0:0 G31479 /1092 /1648 MOC MCZ 11/4/2015 0:0:0 IROP   | 
| G31054 CGH SDU 11/4/2015 0:0:0 G31058 CGH SDU 11/4/2015 0:0:0 IROP         | 
| G37663 /1374 SCL CWB 11/10/2015 0:0:0 G37663 /1920 SCL CWB 2/2/2016 0:0:0 MOVE    | 
| G31490 /1081 SDU RBR 12/10/2015 0:0:0 G31490 /1564 SDU RBR 12/17/2015 0:0:0 MOVE   | 
| G31923 /7660 CWB SCL 11/5/2015 0:0:0 G31923 /7660 CWB SCL 1/29/2016 0:0:0 MOVE     | 

它可以創建一個正則表達式或東西來劃分文本列?

等於這個表:

| OldNumbers   | OldDeparture | OldArrival | OldDeparuteDate | NewNumbers   | NewDeparture | NewArrival | NewDeparuteDate | Type |                 | 
|--------------------|--------------|------------|-----------------|--------------------|--------------|------------|-----------------|------| 
| G31479 /1815 /1844 | MOC   | MCZ  | 11/4/2015  | G31479 /1092 /1648 | MOC   | MCZ  | 11/4/2015  | IROP | 
| G31054    | CGH   | SDU  | 11/4/2015  | G31058    | CGH   | SDU  | 11/4/2015  | IROP | 
| G37663 /1374  | SCL   | CWB  | 11/10/2015  | G37663 /1920  | SCL   | CWB  | 2/2/2016  | MOVE | 
| G31490 /1081  | SDU   | RBR  | 12/10/2015  | G31490 /1564  | SDU   | RBR  | 12/17/2015  | MOVE | 
| G31923 /7660  | CWB   | SCL  | 11/5/2015  | G31923 /7660  | CWB   | SCL  | 1/29/2016  | MOVE | 

我嘗試了一些疑問,但總是在某個時刻爆發:

  SELECT TOP 100 
      CHARINDEX(BD.Detail, ':') 
     , SUBSTRING(BD.Detail,(CHARINDEX('0:0:0',BD.Detail) - 11),11) AS DepartureDateOLD 
     , SUBSTRING(BD.Detail,(CHARINDEX('0:0:0',BD.Detail) - 15),4) AS DepartureOLD 
     , SUBSTRING(BD.Detail,(CHARINDEX('0:0:0',BD.Detail) - 19),4) AS ArrivalOLD 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 20,11) AS DepartureDateNEW 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 28,4) AS DepartureNEW 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 24,4) AS ArrivalNEW 
     , BD.CreatedDate 
     , BD.Detail   
    FROM #FINAL_OLD BD 

而且我不知道爲什麼charindex0:0:0

不工作

編輯:

此查詢的工作取決於日期值:

 SELECT TOP 20 
      PATINDEX('%0:0:0%', BD.Detail) 
     , SUBSTRING(BD.Detail,(PATINDEX('%0:0:0%',BD.Detail) - 11),11) AS DepartureDateOLD 
     , SUBSTRING(BD.Detail,(PATINDEX('%0:0:0%',BD.Detail) - 15),4) AS DepartureOLD 
     , SUBSTRING(BD.Detail,(PATINDEX('%0:0:0%',BD.Detail) - 19),4) AS ArrivalOLD 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 20,11) AS DepartureDateNEW 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 28,4) AS DepartureNEW 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 24,4) AS ArrivalNEW 
     , BD.CreatedDate 
     , BD.Detail   
    FROM #FINAL_OLD BD 

對於此行G31450 /1129 GIG POA 11/4/2015 0:0:0 G31278 GIG POA 11/4/2015 0:0:0 MOVE效果很好。 departurearrival將始終有3個字符,但日期有時有10,9或8個字符,例如1/1/2016 = 8和10/12/2016 = 10個字符,我相信我必須考慮空格,但我不知道該怎麼做。

+0

已更新第一篇文章。 –

回答

0

我不知道是否有更好的方法,但它的工作原理。

 SELECT 
     (CASE 
      WHEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 10,1) = ' ' THEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 9,8) 
      WHEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 11,1) = ' ' THEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 10,9) 
      ELSE SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 11,10) 
      END) AS [DepartureDateOLD]  
     , (CASE 
      WHEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 10,1) = ' ' THEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 17,3) 
      WHEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 11,1) = ' ' THEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 18,3) 
      ELSE SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 19,3) 
      END) AS [DepartureOLD] 
     , (CASE 
      WHEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 10,1) = ' ' THEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 13,3) 
      WHEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 11,1) = ' ' THEN SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 14,3) 
      ELSE SUBSTRING(BD.Detail,PATINDEX('%0:0:0%',BD.Detail) - 15,3) 
      END) AS [ArrivalOLD] 
     , (CASE 
      WHEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 19,1) = ' ' THEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 18,8) 
      WHEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 20,1) = ' ' THEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 19,9) 
      ELSE SUBSTRING(BD.Detail,LEN(BD.Detail) - 20,10) 
      END) AS [DepartureDateNEW]    
     , (CASE 
      WHEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 19,1) = ' ' THEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 26,3) 
      WHEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 20,1) = ' ' THEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 27,3) 
      ELSE SUBSTRING(BD.Detail,LEN(BD.Detail) - 28,3) 
      END) AS [DepartureNEW] 
     , (CASE 
      WHEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 19,1) = ' ' THEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 22,3) 
      WHEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 20,1) = ' ' THEN SUBSTRING(BD.Detail,LEN(BD.Detail) - 23,3) 
      ELSE SUBSTRING(BD.Detail,LEN(BD.Detail) - 24,3) 
      END) AS [ArrivalNEW]   
     , BD.CreatedDate 
     , BD.Detail   
    FROM #FINAL_OLD BD 
+0

很確定總會有一種「更好」的方式,但如果這對你有用,爲什麼不把它標記爲正確? – Shaneis

+0

因爲它仍然不可能,只有明天 –

1

嘗試改變你的charindex到patindex,看看是否可以幫助你。

SELECT TOP 100 
      CHARINDEX(BD.Detail, ':') 
     , SUBSTRING(BD.Detail,(PATINDEX('%0:0:0%',BD.Detail) - 11),11) AS DepartureDateOLD 
     , SUBSTRING(BD.Detail,(PATINDEX('%0:0:0%',BD.Detail) - 15),4) AS DepartureOLD 
     , SUBSTRING(BD.Detail,(PATINDEX('%0:0:0%',BD.Detail) - 19),4) AS ArrivalOLD 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 20,11) AS DepartureDateNEW 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 28,4) AS DepartureNEW 
     , SUBSTRING(BD.Detail,LEN(BD.Detail) - 24,4) AS ArrivalNEW 
     , BD.CreatedDate 
     , BD.Detail   
    FROM #FINAL_OLD BD 
+0

'PATINDEX'works well –

+0

更新了第一篇文章。 –