SQL: Как я могу построить строку из значений столбца одной строки? - PullRequest
1 голос
/ 29 марта 2012

У меня есть такие строки ...

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

Ответы [ 5 ]

1 голос
/ 29 марта 2012
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 отдельных случая, или это будет только один из них.

Вы должны обновить вышеприведенное, чтобы правильно обрабатывать запятые, но я ленив, чтобы вставить это в

1 голос
/ 29 марта 2012

Поскольку дела не являются взаимоисключающими, вам нужно три отдельных дела:

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 голосов
/ 29 марта 2012
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
0 голосов
/ 29 марта 2012

Как насчет этого?

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 голосов
/ 29 марта 2012
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

Я думаю, это должно работать! Дайте мне знать, если это не так;)

...