2013-10-04 2 views
1

У меня есть строка, содержащая иерархию элементов, разделенных символом '/'.Сплит возвратил строку в несколько столбцов

E.g. Класс \ Заказ \ Семейный \ Genus \ Виды

Мне нужно разделить эту строку так, чтобы каждое значение является его собственный столбец, а также отображать оригинальную полную строку

Э.Г.

Mammalia\Carnivora\Felidae\Panthera\Panthera tigris 
Mammalia\Carnivora\Felidae\Panthera\Panthera leo 
Mammalia\Carnivora\Felidae\Panthera\Panthera pardus 

становится

Classification Class Order Family Genus Species 
-------------- ----- ----- ------ ----- ------- 
Mammalia\Carnivora\Felidae\Panthera\tigris Mammalia Carnivora Felidae Pathera tigris 
Mammalia\Carnivora\Felidae\Panthera\leo Mammalia Carnivora Felidae Pathera leo 
Mammalia\Carnivora\Felidae\Panthera\pardus Mammalia Carnivora Felidae Pathera pardus 

Наконец, не все строки будут иметь значения 5, так что сценарий будет нужно ввести NULL для значений, которые не существуют

Э.Г.

Mammalia\Carnivora\Felidae 

становится

Classification Class Order Family Genus Species 
Mammalia\Carnivora\Felidae Mammalia Carnivora Felidae NULL NULL 

ответ

0

Это должно делать то, что вы хотите.

Он использует общие табличные выражения для разделения строки на части (уровни). Пожалуйста, не надо, чтобы я добавил \, чтобы разбить его правильно, чтобы строка ввода не имела \ в конце.

Тогда вы просто получите значение для каждого уровня.

DECLARE @string NVARCHAR(500) = 'Mammalia\Carnivora\Felidae\Panthera\Panthera tigris' 

;WITH cte 
AS 
(
    SELECT SUBSTRING(@string + '\', 1, CHARINDEX('\', @string, 1) - 1) AS Part, 
     SUBSTRING(@string + '\', CHARINDEX('\', @string, 1) + 1, LEN(@string + '\') - CHARINDEX('\', @string, 1) + 1) AS Remainder, 
     0 AS Level 

    UNION ALL 

    SELECT SUBSTRING(cte.Remainder, 1, CHARINDEX('\', cte.Remainder, 1) - 1) AS Part, 
     SUBSTRING(cte.Remainder, CHARINDEX('\', cte.Remainder, 1) + 1, LEN(cte.Remainder) - CHARINDEX('\', cte.Remainder, 1) + 1) AS Remainder, 
     cte.Level + 1 AS Level 
    FROM cte 
    WHERE CHARINDEX('\', cte.Remainder, 1) > 0 
) 

SELECT 
    @string Classification, 
    (SELECT Part FROM cte WHERE Level = 0) Class, 
    (SELECT Part FROM cte WHERE Level = 1) [Order], 
    (SELECT Part FROM cte WHERE Level = 2) Family, 
    (SELECT Part FROM cte WHERE Level = 3) Genus, 
    (SELECT Part FROM cte WHERE Level = 4) Species 
Смежные вопросы