2015-07-02 82 views
0

我有一張這樣的桌子。如何在SQL中將一列分割成多行?

id items 
1 1|2|3 
2 3|4 
... 

現在,我想分割項目到多行,像這樣。

id item 
1 1 
1 2 
1 3 
2 3 
2 4 
... 

SQL可以完成這項工作嗎?

+2

如果@GordonLinoff在這裏,他會告訴你,_best_要做的就是規範化你的數據庫結構,以便項目以關係方式存儲。現在,如果你給我一個'id',我無法知道它與哪個項目相關聯。 –

+0

切勿將數據存儲爲單獨的項目,這隻會導致很多問題。每行一個項目就是SQL方式! – jarlh

回答

-1

由於索引使用等原因,您不應該以這種格式在數據庫中存儲數據。但是在某些情況下,如果外部應用程序以這種方式傳遞信息,則無法避免。如果您必須以這種方式進行存儲並將其分解並以良好的格式進行存儲,則可以使用以下用戶定義的函數來實現它。

CREATE FUNCTION dbo.udf_split (@String nvarchar(max), @Delimiter nchar(1)) 

RETURNS @Results Table (Items nvarchar(max)) 
AS 
BEGIN 
    DECLARE @Index int 
    DECLARE @Slice nvarchar(max) 

    SET @Index = 1 

    IF @String IS NULL RETURN 

    WHILE @Index != 0 
    BEGIN 
     SELECT @Index = CHARINDEX(@Delimiter, @String) 

     IF @Index != 0 
      SELECT @Slice = LEFT(@String, @Index - 1) 
     ELSE 
      SELECT @Slice = @String 

      INSERT INTO @Results(Items) VALUES (LTRIM(RTRIM(@Slice))) 
       SELECT @String = RIGHT(@String, LEN(@String) - @Index) 

      IF Len(@String) = 0 BREAK 
     END 
    RETURN 
END 
GO