TSQL Выберите список запятых в строках - PullRequest
5 голосов
/ 04 декабря 2010

Как превратить поле списка запятых в строку и отобразить его в столбце?

Например,

ID | Colour
------------
1  | 1,2,3,4,5

до:

ID | Colour
------------
1  | 1 
1  | 2
1  | 3
1  | 4
1  | 5

Ответы [ 3 ]

5 голосов
/ 04 декабря 2010

Обычный способ решить эту проблему - создать функцию разделения.Вы можете получить один из Google, например этот из SQL Team .Как только вы создали функцию, вы можете использовать ее следующим образом:

create table colours (id int, colour varchar(255))
insert colours values (1,'1,2,3,4,5')

select  colours.id
,       split.data
from    colours
cross apply
        dbo.Split(colours.colour, ',') as split

.

2 голосов
/ 16 декабря 2010

Другой возможный обходной путь - использование XML (при условии, что вы работаете с SQL Server 2005 или более поздней версии):

DECLARE @s TABLE
    (
      ID INT
    , COLOUR VARCHAR(MAX)
    )

INSERT  INTO @s
VALUES  ( 1, '1,2,3,4,5' )

SELECT  s.ID, T.Colour.value('.', 'int') AS Colour
FROM    ( SELECT    ID
                  , CONVERT(XML, '<row>' + REPLACE(Colour, ',', '</row><row>') + '</row>') AS Colour
          FROM      @s a
        ) s
        CROSS APPLY s.Colour.nodes('row') AS T(Colour)
1 голос
/ 08 мая 2011

Я знаю, что это старый пост, но подумал, что добавлю обновление.Сплиттеры на основе таблиц Tally и cteTally имеют серьезную проблему.Они используют составные разделители, и это убивает их скорость, когда элементы становятся шире, а строки становятся длиннее.

Я исправил эту проблему и написал статью о ней, которую можно найти по следующему URL.http://www.sqlservercentral.com/articles/Tally+Table/72993/

Новый метод открывает двери для всех методов While, Loop, Recursive CTE и XML для VARCHAR (8000).

Я также скажу вам, чтоПарень по имени «Питер» внес улучшения даже в этот код (в обсуждении к статье).Статья все еще интересна, и я буду обновлять вложения с улучшениями Питера на следующий день или два.Я не верю, что между моим главным улучшением и твиком, сделанным Питером, вы найдете более быстрое решение T-SQL-Only для разделения VARCHAR (8000).Я также решил проблему для этой породы сплиттеров для VARCHAR (MAX), и сейчас я также пишу для этого статью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...