Разделить объединенное поле на отдельные части - PullRequest
0 голосов
/ 05 августа 2010

Используя SQL Server 2008, я пытаюсь сделать что-то похожее на этот пост относительно разделения объединенного поля на отдельные части для целей нормализации.

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

Данные, которые я пытаюсь разделить, будут похожи на:

UserID - ConcatField
1 - ABC
2 -- DEF

Я бы хотел, чтобы выходные данные были такими:

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

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

Ответы [ 3 ]

1 голос
/ 06 августа 2010

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

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

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

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

0 голосов
/ 06 августа 2010

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

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

Редактировать: Хотя, как отметил Джефф Моден в комментариях, производительность рекурсивных CTEэто далеко не так, так что вам лучше всего создать таблицу постоянных чисел, используя один из методов отсюда , а затем использовать

SELECT  UserID ,
        SUBSTRING(ConcatField, i, 1) AS ConcatField
INTO    #NewTemporaryTable
FROM    YourTable
        JOIN Numbers ON Number <= LEN(ConcatField)
0 голосов
/ 06 августа 2010

Просмотр доступных строковых функций в TSQL: http://msdn.microsoft.com/en-us/library/ms181984.aspx

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...