将多个列值作为逗号分隔值放入单个列中

时间:2015-06-15 06:42:21

标签: sql sql-server

我有一个表格Expression e = new ExpressionBuilder("3 * sin(y) - 2 / (x - 2)") .variables("x", "y") .build() .setVariable("x", 2.3) .setVariable("y", 3.14); double result = e.evaluate(); ,其中包含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 发生在某些情况的最后一个位置(如果commaCommentD, CommetE

有没有办法解决所有案件。

Sample SQL Fiddle

3 个答案:

答案 0 :(得分: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中的结果。

答案 1 :(得分:1)

以上答案是正确的,并且没有对接受的答案提出质疑,但是如果某些列有空字符串而不是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

答案 2 :(得分: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