2016-04-27 4 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 

И я не знаю, почему charindex не работает для 0:0:0

EDIT:

Этот запрос работает в зависимости значение даты:

 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 работает хорошо. У departure и arrival всегда будет 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

Первое сообщение обновлено. –