2015-07-20 60 views
0

我在SQL Server中的字段,有时可以包含文本通过管道这样的分离:如何分隔SQL中的字段并从该字段创建单独的行?

COLOUR 
Red 
Blue|Red|Yellow 
Green|White 
Yellow 

我想创建这样的:

COLOUR   SUBCOLOUR 
Red    Red 
Blue|Red|Yellow Blue 
Blue|Red|Yellow Red 
Blue|Red|Yellow Yellow 
Green|White  Green 
Green|White  White 
Yellow   Yellow 

任何人有什么想法?

谢谢

+1

你“想创造这个”在哪里?你是否问如何创建一个***新表***来规范管道分隔数据?出于某种原因将列添加到现有表中?仅在select语句中?请详细说明 – Kritner

+0

我想从上面第二个表格格式的现有数据创建一个新表格。 – wilsonm2

+0

@ wilsonm2可能会得到符合您的要求的答案 – mohan111

回答

1

通过分割功能就可以达到预期的结果集

declare @t table (Colour varchar(50)) 
    insert into @t (Colour) 
    values 
    ('Red'), 
    ('Blue|Red|Yellow'), 
    ('Green|White'), 
    ('Yellow') 



;with cte as (
    SELECT Colour As Colour , 
     Split.a.value('.', 'VARCHAR(100)') AS SubColour 
    FROM (SELECT Colour, 
      CAST ('<M>' + REPLACE([Colour], '|', '</M><M>') + '</M>' AS XML) AS String 
     FROM @t) AS A CROSS APPLY String.nodes ('/M') AS Split(a)) 

     select * from cte 
0

未经测试,但有评论。使用变量和游标,所以只会建议如果这不是一个大表,你只做一次。我会很乐意提供更多的解释,如果这并不为你工作:

CREATE TABLE NewTable (Colour varchar(50),SubColour varchar(50)) 

SELECT Colour, LEN(Colour) - LEN(REPLACE(Colour,'|','')) AS delimCount 
INTO #temp FROM [ColourTable] 

DECLARE @i int 
DECLARE @delimLoc int 
DECLARE @Colour varchar(50) 
DECLARE @subColour varchar(50) 
DECLARE ColourCursor CURSOR FOR SELECT * FROM #temp; 
OPEN ColourCursor; 

通过表

WHILE @@FETCH_STATUS = 0 
BEGIN 

FETCH NEXT FROM ColourCursor INTO @Colour; 
SET @i = 1 
SET @delimLoc = 0 
IF delimCount > 0 

BEGIN 
WHILE @i <= delimCount 

环路去逐行创建subcolor从最后的位置去使用'|' (或色域的开始。如果@i = 1)

BEGIN 
SET @subColour = SUBSTRING(@Colour,@delimLoc+1,CHARINDEX(@Colour,'|',@delimLoc+1)) 
INSERT INTO NewTable VALUES (@Colour,@subColour) 
SET @i = @i + 1 
SET @delimLoc = @delimLoc + CHARINDEX(@Colour,'|',@delimLoc+1) 
END 

END 

END 

CLOSE ColourCursor 
DEALLOCATE ColourCursor; 
+1

与光标相比,有几十个更好的分割字符串选项。对于这种事情,游标的性能很差。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings当然,OP的最佳选择是停止存储违反1NF的数据。 –

+0

@ wilsonm2看到这些建议比我发布的更好的选择。如果要为每个SubColour包含原始颜色字段,则可能需要进行一些调整 –

相关问题