2015-06-15 3 views
6

У меня есть стол CommentsTable с колонками, как, CommentA, CommentB, CommentC, CommentD, CommentE.Несколько значений столбцов в одном столбце как значение, разделенное запятой

Все столбцы комментариев - VARCHAR (200), по умолчанию все столбцы - NULL.

Данные выглядит следующим образом:

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 

Мне нужно, чтобы избежать нулевых значений, а остальные значения конкатенации с comma.

Таким образом, ожидаемый результат, как:

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 

Я попытался с простого запроса:

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

Но нежелательные comma являются не произошло, поэтому добавил 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 

Но здесь также, comma произошел в последнем по для некоторых случаев (если CommentD, CommetE - NULL.

Есть ли способ достичь решения для всех случаев.

Sample SQL Fiddle

+0

обновите свой скрипт sql скрипта, в последнем примере высеваете именно ту ситуацию, когда у вас есть нежелательная запятая в конце. –

ответ

9

Вы можете использовать ISNULL как это ISNULL(',' + CommentA, '') и написать запрос, как это.

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

Просмотреть результат в SQL Fiddle.

+0

Быстрее, чем я тоже, но я действительно не вижу необходимости в «STUFF» здесь ... –

+2

@ ZoharPeled нужно удалить исходный ',' – ughai

+2

@RagingBull - Спасибо, я тоже закончил свою работу :) – 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') 

Использовать этот код:

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

Приведенные выше ответы правильны и не вызов принят ответ, но в случае, если некоторые столбцы не имеют пустую строку вместо NULL, то ниже, может помочь. Пожалуйста, не стесняйтесь для лучшего подхода и исправьте меня, если это неправильно.

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 
Смежные вопросы