Basierend auf Ihren Tabellen:
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')
Erstellen Sie eine neue Tabelle wie diese:
CREATE TABLE Numbers
(
Number int not null primary key
)
die Zeilen mit den Werten 1 bis 8000 oder so enthält.
wird das Gewünschte zurückgeben:
EDIT
Hier ist eine viel bessere Anfrage, leicht abgewandelt von der großartigen Antwort von @Christopher Klein:
Ich habe "LTRIM()" hinzugefügt, damit die Leerzeichen in der Farbliste richtig behandelt werden: "rot, blau, grün". Seine Lösung erfordert keine Leerzeichen "rot, blau, grün". Außerdem ziehe ich es vor, meine eigene Zahlentabelle und nicht master.dbo.spt_values zu verwenden, da dies auch das Entfernen einer abgeleiteten Tabelle ermöglicht.
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 ENDE
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
Hier ist meine Ergebnisliste:
ProductId Color
----------- --------------
1 red
1 blue
1 green
2 NULL
3 purple
3 green
(6 row(s) affected)
was die gleiche Reihenfolge ist, die Sie wollen...