basé sur vos tables:
create table test_table
(
ProductId int
,Color varchar(100)
)
insert into test_table values (1, 'red, blue, green')
insert into test_table values (2, null)
insert into test_table values (3, 'purple, green')
créer une nouvelle table comme ceci:
CREATE TABLE Numbers
(
Number int not null primary key
)
que a des lignes contenant des valeurs de 1 à 8000 ou plus.
ce retournera ce que vous voulez:
EDIT
ici est une bien meilleure requête, légèrement modifiée de la grande réponse de @Christopher Klein:
J'ai ajouté le "LTRIM()" les espaces de la liste de couleurs seraient donc gérés correctement: "rouge, bleu, vert". Sa solution ne nécessite aucun espace "rouge, bleu, vert". De plus, je préfère utiliser ma propre table Number et ne pas utiliser master.dbo.spt_values, cela permet également de supprimer une table dérivée.
SELECT
ProductId, LEFT(PartialColor, CHARINDEX(',', PartialColor + ',')-1) as SplitColor
FROM (SELECT
t.ProductId, LTRIM(SUBSTRING(t.Color, n.Number, 200)) AS PartialColor
FROM test_table t
LEFT OUTER JOIN Numbers n ON n.Number<=LEN(t.Color) AND SUBSTRING(',' + t.Color, n.Number, 1) = ','
) t
EDIT FIN
SELECT
ProductId, Color --,number
FROM (SELECT
ProductId
,CASE
WHEN LEN(List2)>0 THEN LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(',', List2, number+1)-number - 1)))
ELSE NULL
END AS Color
,Number
FROM (
SELECT ProductId,',' + Color + ',' AS List2
FROM test_table
) AS dt
LEFT OUTER JOIN Numbers n ON (n.Number < LEN(dt.List2)) OR (n.Number=1 AND dt.List2 IS NULL)
WHERE SUBSTRING(List2, number, 1) = ',' OR List2 IS NULL
) dt2
ORDER BY ProductId, Number, Color
ici est mon jeu de résultats:
ProductId Color
----------- --------------
1 red
1 blue
1 green
2 NULL
3 purple
3 green
(6 row(s) affected)
qui est le même ordre que vous voulez ...
donner ma méthode un essai, il sera beaucoup plus rapide ... –