【问题标题】:Split text across multiple columns - SQL Server跨多列拆分文本 - SQL Server
【发布时间】:2016-08-21 23:30:06
【问题描述】:

例子:

|                  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

编辑:

此查询根据日期值起作用:

     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 个字符,我相信我必须考虑一下空格,但我不知道该怎么做。

【问题讨论】:

    标签: sql-server split substring charindex


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我不知道是否有更好的方法,但它有效。

           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
      

      【讨论】:

      • 很确定总会有一种“更好”的方法,但如果这对你有用,你为什么不把它标记为正确呢?
      • 因为还是不行,只有明天
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      相关资源
      最近更新 更多