2010-08-05 3 views
0

Используя SQL Server 2008, я пытаюсь сделать что-то похожее на сообщение this относительно разделения конкатенированного поля на отдельные части для нормализации.Разделите конкатенированное поле на отдельные части

Проблема с решениями в связанной записи заключается в том, что они работают только для ограниченных значений.

Данные, которые я пытаюсь расколоть бы выглядеть следующим образом:

UserID - ConcatField
1 - ABC
2 - DEF

Я хотел бы выход быть похожим:

Идентификатор_пользователя - ConcatField
1. -
1 - B
1 - С
2 - D
2 - E
2 - F

Есть ли функция, чтобы разделить эти значения без использования разделителей?

ответ

0

Это вы имеете в виду?

WITH X AS 
(
SELECT 1 AS UserID,'ABC' AS ConcatField UNION ALL 
SELECT 2 AS UserID,'DEF' AS ConcatField 
), N AS 
    (SELECT 1 i 
    UNION ALL 
    SELECT i+1 
    FROM N 
    WHERE i<1000 /*Or whatever your max string length is*/ 
    ) 

SELECT UserID,SUBSTRING(ConcatField,i,1) as ConcatField 
INTO #NewTemporaryTable 
FROM X JOIN N ON I<= LEN(ConcatField) 
OPTION(MAXRECURSION 0) 

дает

UserID  ConcatField 
----------- ----------- 
1   A 
1   B 
1   C 
2   D 
2   E 
2   F 

Edit: Хотя как Джефф Moden указывает в комментариях производительность рекурсивной КТР является далеко от большой, так что вы бы лучше с созданием постоянной таблицы чисел, используя один методов from here, а затем с использованием

SELECT UserID , 
     SUBSTRING(ConcatField, i, 1) AS ConcatField 
INTO #NewTemporaryTable 
FROM YourTable 
     JOIN Numbers ON Number <= LEN(ConcatField) 
+0

Perfect. Спасибо! – Sesame

+0

Последующий вопрос: как я могу вставить результаты в таблицу? – Sesame

+0

новый стол или существующая таблица? –

1

У Джеффа Модена есть отличная статья о таблицах Tally в SQL Server Central, в которой содержится раздел о разделении строк, подобных этому. Вторая статья, приведенная ниже, представляет собой более подробный анализ строк, использующих таблицу Tally.

http://www.sqlservercentral.com/articles/T-SQL/62867/

http://www.sqlservercentral.com/articles/Tally+Table/70738/

(Бесплатная подписка требуется)

0

Обзор доступные строковые функции в TSQL: http://msdn.microsoft.com/en-us/library/ms181984.aspx

После загрузки исходных данных в таблице, вы можете разделить их относительно легко используя следующие функции:
* CHARINDEX
* SUBSTRING
* LEN
* ЛЕВЫЙ & ПРАВЫЙ

Фактическая реализация будет, конечно, зависеть от самих данных, но после разделения записи (может быть, путем обработки их несколько раз, сначала извлечение C, а затем B, то A от 1 - ABC), вам должно быть хорошо идти.

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