2013-10-04 33 views
1

我有一个字符串,其中包含由'/'字符分隔的项目层次结构。将返回的字符串拆分为多个列

E.g.类\订单\家庭\属\种

我需要打出此字符串使得每个价值是自身列以及显示原始满弦

例如

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