2012-03-29 28 views
1

我有这样的行...SQL:我如何从一行的列值构建一个字符串?

| 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 
+0

你能告诉我们你的尝试吗?既然你确实得到了一个价值,我相信你非常接近。 – dasblinkenlight 2012-03-29 19:02:32

+0

当然加了谢谢! – daveomcd 2012-03-29 19:05:28

回答

1

由于这些情况不相互排斥的,您需要三个独立的情况:

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 
+0

非常感谢! – daveomcd 2012-03-30 12:03:38

0
SELECT Name, 
    CONCAT(
     IF(Red = 1, 'Red', ''), 
     IF(Red = 1 AND Blue = 1, ', ', ''), 
     IF(Blue = 1, 'Blue', ''), 
     IF(Red = 1 AND Green = 1 AND `Blue` = 0, ', ', ''), 
     IF(Blue = 1 AND Green = 1, ', ', ''), 
     IF(Green = 1, 'Green', '') 
    ) AS Note 
From Table 

我认为这应该工作!让我知道,如果它不;)

+0

在T-SQL中没有这样的IF。 – Tomalak 2012-03-29 19:09:24

+0

这将在Sql Server 2008中工作吗?我收到一个语法错误。 – daveomcd 2012-03-29 19:13:18

+0

我想如果你得到一个语法错误,不会。 CONCAT不是sql server 2008格式,我猜IF语句不太好。我想你可能需要从下面的@Tomalak看帖子! – pascalvgemert 2012-03-29 20:37:19

1
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 
FROM tableName 

需要有3个不同的情况下,或者它只会做其中一个。

您将需要更新上述处理逗号适当为好,但即时通讯懒得把在

0

这是怎么回事?

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 
0
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 
相关问题