2016-12-09 2 views
-1

сепаратора обеспечивают меня есть столбец, ниже которого содержит данные, как показаноSQL-расщепление столбец в 3-х различных столбцов с несколькими

|DeliveryComment   | 
|-------------------------|  
|[1 * B018]    | 
|GARAGE     | 
|BACK GARDEN. [124 * B002]| 
|[1 * B018]    | 
|       | 
|[124 * B002]    | 
|[1 * B018]    | 
|       |  
|[124 * B002]    | 

Я хотел бы разделить эти данные на три колонки отображаются, как показано ниже.

|ColA  |ColB|ColC| 
|-----------|----|----|  
|   |1 |B018| 
|GARAGE  | | | 
|BACK GARDEN|124 |B002| 
|   |1 |B018|  
|   | | |  
|   |124 |B002| 
|   |1 |B018| 
|   | | |  
|   |124 |B002| 

Данные, которые должны быть в столбце А, могут быть переменными до 11 символов. Данные, которые должны заканчиваться в столбце B, могут быть переменными числовыми значениями до 3 символов. Данные, которые должны быть в столбце C, могут быть переменными до 4 символов.

Во всех номерах всегда будет [], и между ними всегда будет *.

+0

Кажется, достаточно простая задача. что ты уже испробовал? –

ответ

1

Создать и заполнить образец таблицы (Пожалуйста сохранить нас этот шаг в ваших будущих вопросов)

DECLARE @t AS TABLE 
(
    col varchar(50) 
) 

INSERT INTO @T VALUES 
('[1 * B018]'), 
('GARAGE'), 
('BACK GARDEN. [124 * B002]'), 
('[1 * B018]'), 
(''), 
('[124 * B002]'), 
('[1 * B018]'),   
(''), 
('[124 * B002]') 

Запрос:

SELECT CASE WHEN charindex('[', col) > 0 THEN 
      LEFT(col, charindex('[', col)-1) 
     ELSE 
      col 
     END AS ColA, 

     CASE WHEN charindex('[', col) = 0 THEN 
      '' 
     ELSE 
      SUBSTRING(col, charindex('[', col) +1 ,charindex('*', col) - charindex('[', col) - 1) 
     END AS ColB, 

     CASE WHEN charindex('[', col) = 0 THEN 
      '' 
     ELSE 
      SUBSTRING(col, charindex('*', col) +1 ,charindex(']', col) - charindex('*', col) - 1) 
     END AS ColC 
FROM @T 

Результаты:

ColA   ColB ColC 
       1  B018 
GARAGE  
BACK GARDEN. 124  B002 
       1  B018 

       124  B002 
       1  B018 

       124  B002 
+0

Это замечательно. Следует упомянуть, что это образец данных, есть ли способ извлечения данных из целого столбца во временную таблицу так, как вы указали выше? Если нет, я могу добавить поля во временный запрос таблицы. –

+0

Вы можете использовать 'select в # tmp' для заполнения временной таблицы. –

0

Это решение использует CROSS APPLY, чтобы упростить управление CHARINDEX.

SELECT 
    LEFT(SUBSTRING(col,1,CASE WHEN a= 0 THEN LEN(col) ELSE a-1 END),11) AS [ColA] 
    ,REPLACE(SUBSTRING(col,a+1,b-a),'*','') AS [ColB] 
    ,REPLACE(SUBSTRING(col,b+1,c-b),']','') AS [ColC] 
FROM 
    @t 
     CROSS APPLY(SELECT CHARINDEX('[',Col,0)A 
          ,CHARINDEX('*',Col,0)B 
          ,CHARINDEX(']',Col,0)C 
          ) Z 

Примечание: примеры вы до сих пор -включая этот один - в настоящее время имеют начальные и конечные пробелы, которые необходимо будет зачистка с RTRIM & LTRIM. Но сейчас они облаковали бы код.