SQL:如何从一行的列值构建字符串?
我有像这样的排SQL:如何从一行的列值构建字符串?,sql,select,sql-server-2008-r2,case-statement,Sql,Select,Sql Server 2008 R2,Case Statement,我有像这样的排 | NAME | RED | BLUE | GREEN | LeAnn 1 0 1 Jim 0 0 0 Timothy 1 1 1 我想写一个select语句,它将返回以下行 | Name | Note | LeAnn RED, Green Jim Timothy RED, BLU
| NAME | RED | BLUE | GREEN |
LeAnn 1 0 1
Jim 0 0 0
Timothy 1 1 1
我想写一个select语句,它将返回以下行
| Name | Note |
LeAnn RED, Green
Jim
Timothy RED, BLUE, GREEN
我该怎么做?我尝试使用case语句,但在Note中只得到一个值,而不是多个值。谢谢
我的尝试:
SELECT Name,
CASE
WHEN Red = 1 THEN 'Red' + ', '
WHEN Blue = 1 THEN 'Blue' + ', '
WHEN Green = 1 THEN 'Green' + ', '
END as Note
FROM MyTable
我想这应该管用!如果没有,请告诉我;)
需要有3个单独的案例,否则它将只执行其中一个
您需要更新以上内容以正确处理逗号,但我懒得将其放入,因为这些情况并不相互排斥,您需要三种不同的情况:
SELECT ('' +
CASE WHEN Red = 1 THEN 'Red, ' ELSE '' END
+ CASE WHEN Blue = 1 THEN 'Blue, ' ELSE '' END
+ CASE WHEN Green = 1 THEN 'Green, ' ELSE '' END
)
AS Note
FROM MyTable
这个怎么样
select name, left(Note, abs(len(Note) - 1)) from (
select name, '' +
CASE WHEN Red = 1 THEN 'Red, ' ELSE '' END +
CASE WHEN Blue = 1 THEN 'Blue, ' ELSE '' END +
CASE WHEN Green = 1 THEN 'Green, ' ELSE '' END
as Note
from t
) final
这将创建一个必须修剪的尾随逗号。例如:
SELECT
REPLACE(
''
+ ISNULL(NULLIF(Red, 0), 'Red, ')
+ ISNULL(NULLIF(Blue, 0), 'Blue, ')
+ ISNULL(NULLIF(Green, 0), 'Green, ')
+ '$',
', $',
''
) AS Note
FROM
TheTable
你能告诉我们你的尝试吗?既然您得到了一个值,我相信您已经非常接近了。T-SQL中没有这样的
IF
。这在SQL Server 2008中有效吗?我有语法错误。如果你有语法错误,我想不会。CONCAT不是SQLServer2008格式,我想IF语句也不是。我想你可能需要看看下面@Tomalak的帖子@pascalvgemert在SQL Server中提供IF
语句。它做流量控制。虽然没有IF
功能,但这是通过CASE WHEN
解决的。对于这里的任何人来说,我都是通过在每个CASE语句行的末尾添加+
来解决的(最后一行除外)。@Danny谢谢你的评论。谢谢你的回答,八年后它帮助了我!
select name, left(Note, abs(len(Note) - 1)) from (
select name, '' +
CASE WHEN Red = 1 THEN 'Red, ' ELSE '' END +
CASE WHEN Blue = 1 THEN 'Blue, ' ELSE '' END +
CASE WHEN Green = 1 THEN 'Green, ' ELSE '' END
as Note
from t
) final
SELECT
''
+ ISNULL(NULLIF(Red, 0), 'Red, ')
+ ISNULL(NULLIF(Blue, 0), 'Blue, ')
+ ISNULL(NULLIF(Green, 0), 'Green, ')
AS Note
FROM
TheTable
SELECT
REPLACE(
''
+ ISNULL(NULLIF(Red, 0), 'Red, ')
+ ISNULL(NULLIF(Blue, 0), 'Blue, ')
+ ISNULL(NULLIF(Green, 0), 'Green, ')
+ '$',
', $',
''
) AS Note
FROM
TheTable