2015-06-15 11 views
6

Ich habe eine Tabelle CommentsTable mit Spalten wie, CommentA, CommentB, CommentC, CommentD, CommentE.Mehrere Spaltenwerte in eine einzelne Spalte als kommagetrennten Wert

Alle Kommentare Spalten sind VARCHAR (200), standardmäßig sind alle Spalten NULL auch.

Die Daten wie folgt aussieht:

CommentId CommentA CommentB CommentC CommentD CommentE 
--------------------------------------------------------------------- 
12345  NULL  C 001  C 002  NULL  C 003 
45678  C 005  NULL  NULL  C 007  NULL 
67890  C 010  NULL  C 011  C 012  NULL 
36912  C 021  C 023  C 024  C 025  C 026 

ich die Null-Werte zu vermeiden, müssen die restlichen Werte sind concatenate mit comma.

also die erwartete Ausgabe wie:

CommentId CommetDetails 
------------------------------- 
12345  C 001, C 002, C 003 
45678  C 005, C 007 
67890  C 010, C 011, C 012 
36912  C 021, C 023, C 024, C 025, C 026 

ich mit einfacher Abfrage versucht:

SELECT CommentId, ISNULL(CommentA, '') + ', ' + ISNULL(CommentB, '') + ', ' + 
     ISNULL(CommentC, '') + ', ' + ISNULL(CommentD, '') + ', ' + 
     ISNULL(CommentE, '') [CommentDetails] 
FROM CommentsTable 
WHERE ...... --Some conditions 

Aber die unerwünschten comma aufgetreten sind, hinzugefügt So IIF

SELECT CommentId, 
     IIF(ISNULL(CommentA, '') <> '', (CommentA + ', '), '') + 
     IIF(ISNULL(CommentB, '') <> '', (CommentB + ', '), '') + 
     IIF(ISNULL(CommentC, '') <> '', (CommentC + ', '), '') + 
     IIF(ISNULL(CommentD, '') <> '', (CommentD + ', '), '') + 
     ISNULL(CommentE, '') [CommentDetails] 
FROM CommentsTable 
WHERE ...... --Some conditions 

Aber hier auch der comma trat zuletzt auf Position für einige Fälle (Wenn CommentD, CommetE sind NULL.

Gibt es einen Weg zu erreichen, um für alle Fälle zu lösen.

Sample SQL Fiddle

+0

update Sie sql Geigenskript mit Ihrem letzten Beispiel Aussaat genau die Situation, wo Sie ein unerwünschtes Komma am Ende haben. –

Antwort

9

Sie können ISNULL wie diese ISNULL(',' + CommentA, '') und schreiben Sie Ihre Abfrage wie folgt verwendet werden.

SELECT CommentId, 
STUFF(
ISNULL(',' + CommentA, '') + 
ISNULL(',' + CommentB, '') + 
ISNULL(',' + CommentC, '') + 
ISNULL(',' + CommentD, '') + 
ISNULL(',' + CommentE, ''),1,1,'') as [CommentDetails] 
FROM CommentsTable 
WHERE ...... //Some conditions 

Siehe Ergebnis in SQL Fiddle.

+0

Schneller dann ich auch, aber ich weiß nicht wirklich die Notwendigkeit 'STUFF' siehe hier ... –

+2

@ZoharPeled Notwendigkeit, die ursprünglichen', ' – ughai

+2

@RagingBull zu entfernen - Danke, ich war Finishing auch meinen :) – ughai

0
create table #test 
(
CommentId int, 
CommentA nvarchar(200), 
CommentB nvarchar(200), 
CommentC nvarchar(200), 
CommentD nvarchar(200), 
CommentE nvarchar(200) 

) 
insert into #test values(12345,NULL,'C 001','C 002',NULL,'C 003') 
insert into #test values(45678,'C 005',NULL,NULL,'C 007',NULL) 
insert into #test values(67890,'C 010',NULL,'C 011','C 012',NULL) 
insert into #test values(36912,'C 021','C 023','C 024','C 025','C 026') 

Verwendung Dieser Code:

select CommentId,STUFF(ISNULL(','+CommentA,'')+ 
         ISNULL(','+CommentB,'')+ 
         ISNULL(','+CommentC,'')+ 
         ISNULL(','+CommentD,'')+ 
         ISNULL(','+CommentE,''),1,1,'') As Comment 
from #test 
order by CommentId 
0

Die oben genannten Antworten sind richtig und keine Herausforderung für die akzeptierte Antwort, aber falls einige Spalten leere Zeichenfolge statt null, dann könnte unten helfen. Bitte zögern Sie nicht für eine bessere Annäherung und korrigieren Sie mich, wenn es falsch ist.

Verwandte Themen