2

我有这样的行...

|  NAME  |   RED  |  BLUE  |  GREEN  |
  LeAnn       1        0         1
  Jim         0        0         0
  Timothy     1        1         1

我想编写一个将返回以下行的选择语句...

| 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
4

5 回答 5

2

由于这些案例不是相互排斥的,因此您需要三个单独的案例:

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
于 2012-03-29T19:07:44.000 回答
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 个单独的案例,否则它只会做其中一个。

您还需要更新上述内容以正确处理逗号,但我懒得把它放进去

于 2012-03-29T19:07:25.327 回答
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

我认为这应该工作!如果没有,请告诉我;)

于 2012-03-29T19:07:19.193 回答
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
于 2012-03-29T19:17:08.783 回答
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
于 2012-03-29T19:18:08.980 回答