2015-07-02 2 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 
Смежные вопросы