2015-06-15 13 views
6

Ho una tabella CommentsTable con colonne come CommentA, CommentB, CommentC, CommentD, CommentE.Più valori di colonna in una singola colonna come valore separato da virgola

Tutte le colonne dei commenti sono VARCHAR (200), per impostazione predefinita tutte le colonne sono anche NULL.

I dati si presenta come:

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 

ho bisogno di evitare i valori nulli e valori rimanenti vengono concatenate con comma.

Quindi, i risultati attesi come:

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 

ho provato con semplice query: si è verificato

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

Ma gli indesiderati comma, così aggiunto 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 

Ma qui inoltre, lo comma si è verificato nell'ultimo posizione per alcuni casi (se CommentD, CommetE sono NULL.

C'è un modo per raggiungere per risolvere tutti i casi.

Sample SQL Fiddle

+0

aggiorna lo script sql fiddle con il tuo ultimo esempio seminando esattamente la situazione in cui hai una virgola indesiderata alla fine. –

risposta

9

È possibile utilizzare ISNULL come questo ISNULL(',' + CommentA, '') e scrivere la query in questo modo.

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

Vedere il risultato in SQL Fiddle.

+0

Più veloce anche io, ma non vedo davvero la necessità di 'STUFF' qui ... –

+2

@ZoharPeled è necessario rimuovere l'iniziale', ' – ughai

+2

@RagingBull - Grazie, stavo finendo anche il mio :) – 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') 

di questo codice:

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

Le risposte sopra sono esatte e nessuna sfida per la risposta accettata, ma nel caso in cui alcune colonne hanno stringa vuota invece di null poi seguito potrebbe aiutare. Per favore non esitare per un approccio migliore e correggimi se è sbagliato.

SELECT CommentId, 
STUFF(
ISNULL(',' + CASE WHEN CommentA= '' THEN NULL ELSE CommentA END, '') + 
ISNULL(',' + CASE WHEN CommentB= '' THEN NULL ELSE CommentB END, '') + 
ISNULL(',' + CASE WHEN CommentC= '' THEN NULL ELSE CommentC END, '') + 
ISNULL(',' + CASE WHEN CommentD= '' THEN NULL ELSE CommentD END, '') + 
ISNULL(',' + CASE WHEN CommentE= '' THEN NULL ELSE CommentE END, ''),1,1,'') as [CommentDetails] 
FROM CommentsTable 
Problemi correlati