2017-02-17 7 views
1

У меня есть столбец в таблице, я хотел бы разделить содержимое на разные столбцы, расположение тире не всегда одинаково. Просьба сообщить более простой код.MS SQL Server: расширенная подстрока, разделяющая один столбец столбца на многомерные столбцы

Спасибо.

 COL1 
AGH-WH6X-23-4534-OPDQE-QADF 
xxx-xxxx-xxxx-xxxx-xxx-xxxx  
xxx-xxxx-xxxxxx-xxxx-xxxxx-xx 
x-xx-xxxx-xxxxxx-xxxx-xxx-xx  
xxx-xx-xxxx-xxxx-xxx-xxx-x 
xxx-xxxx-xxxxxx-xxxxxx-xxx-xx  
x-xxx-xxxx-xxxx-xxxxxx-xxx-xx 
xxx-xxxxx-xxxx-xxxxxx-xxx-xx 

Expectation:

COL2 COL3 COL4 COL5 COL6 COL7 
AGH WH6X 23 4534 OPDQE QADF 
xxx xxxx xxxx xxxx xxx NULL 
+2

Что ваш вопрос? Примеры данных * и * желаемые результаты были бы полезными. Если вы хотите разбить строку на SQL Server, вы можете захотеть разделить «sql server» на Google. –

+0

@GordonLinoff, у меня есть рабочий запрос, просто хотелось бы знать, можно ли его сделать с помощью более простого запроса. –

ответ

2

Один метод является рекурсивным КТР с агрегацией:

with cte as (
     select col1, left(col1, charindex('-', col1 + '-') - 1) as val, 
      1 as level, 
      substring(col1, charindex('-', col1) + 1, len(col1)) as rest 
     from t 
     union all 
     select col1, left(rest, charindex('-', rest + '-') - 1), 
      level + 1, 
      substring(rest, charindex('-', rest + '-') + 1, len(col1)) 
     from cte 
     where rest > '' 
    ) 
select max(case when level = 1 then val end) as val1, 
     max(case when level = 2 then val end) as val2, 
     max(case when level = 3 then val end) as val3, 
     max(case when level = 4 then val end) as val4, 
     max(case when level = 5 then val end) as val5, 
     max(case when level = 6 then val end) as val6, 
     max(case when level = 7 then val end) as val7 
from cte 
group by col1; 
+0

Просто опечатка и недостающее ')'. теперь он работает fn. –

+0

@GordonLinoff, этот запрос занимает слишком много времени для работы в таблице больших масштабов. Есть ли способ его оптимизировать, спасибо. –

+0

@ Явлон Исматов. , , Возможно, вы захотите задать другой вопрос, с образцами данных, желаемыми результатами и ссылкой на этот вопрос. Идея такова: «этот код работает, но я хочу сделать его быстрее». –

 Смежные вопросы

  • Нет связанных вопросов^_^