Search code examples
sql-serversplitsubstringcharindex

Split text across multiple columns - SQL Server


Example:

|                  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                 |

It is possible to create a regular expression or something to divide the text into columns?

Equal to this table:

| 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 |

I tried a few queries, but always breaks at some point:

         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

And I do not know why charindex is not working for 0:0:0

EDIT:

This query works depending the date value:

     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

For this line G31450 /1129 GIG POA 11/4/2015 0:0:0 G31278 GIG POA 11/4/2015 0:0:0 MOVE works well. The departure and arrival will always have 3 characters, but the date sometimes have 10, 9 or 8 characters, for example 1/1/2016 = 8 and 10/12/2016 = 10 characters, I believe that I must consider the spaces, but I do not know how to do this.


Solution

  • I do not know if there is a better way, but it works.

         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