2016-04-27 6 views
0

例:スプリットテキスト - SQL Serverの

|     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 

そして0:0:0

のために働いていない理由 charindex私は知りません

編集:

うまく機能 G31450 /1129 GIG POA 11/4/2015 0:0:0 G31278 GIG POA 11/4/2015 0:0:0 MOVEこのラインについて

 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 

このクエリは、日付値を依存動作します。 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'はうまく –

+0

最初の投稿が更新されました。 –