2017-01-29 6 views
0

В PostgreSQL, как я могу объединить несколько столбцов в один столбец с несколькими строками?Объединить несколько столбцов в один столбец с несколькими строками

Столбцы все логическое значение, так что я хочу:

  • Фильтр для истинных значений только
  • Заменить истинное значение (1) с именем столбца (A, B или C)

у меня есть эта таблица:

ID | A | B | C 
1  0  1  0 
2  1  1  0 
3  0  0  1 
4  1  0  1 
5  1  0  0 
6  0  1  1 

Я хочу, чтобы получить эту таблицу:

ID | Letter 
1  B 
2  A 
2  B 
3  C 
4  A 
4  C 
5  A 
6  B 
6  C 

ответ

3

Я думаю, что нужно что-то вроде этого:

SELECT ID, 'A' as Letter FROM table WHERE A=1 
UNION ALL 
SELECT ID, 'B' as Letter FROM table WHERE B=1 
UNION ALL 
SELECT ID, 'C'as Letter FROM table WHERE C=1 
ORDER BY ID, Letter 
+0

Это не сортируется. –

+0

Теперь упорядочен только набор результатов 3-го запроса. –

+0

И '' A'', '' B'', '' C'' не находятся под 'Letter'. –

1
SELECT ID, 
(CASE 
    WHEN TABLE.A = 1 then 'A' 
    WHEN TABLE.B = 1 then 'B' 
    WHEN TABLE.C = 1 then 'C' 
    ELSE NULL END) AS LETTER 
from TABLE 
+0

Если A = 1 и B = 1 в той же строке, ваш запрос вернет только 1 строку с «A». –

+1

Вы правы, я думал, что было только одно «1» за время – Ollaw

+0

выглядит хорошо. но он получает только один из каждой строки, даже если имеется более одного столбца с 1. – Shiping

1

Вы можете попробовать это.

insert into t2 select id, 'A' from t1 where A=1; 
insert into t2 select id, 'B' from t2 where B=1; 
insert into t2 select id, 'C' from t3 where C=1; 

Если вас интересует заказ, вы можете сделать это.

insert into t3 select id, letter from t2 order by id, letter; 
0

W/о UNION

Вы можете использовать один запрос, чтобы получить желаемый результат. Real time example

select id 
    ,regexp_split_to_table((
      concat_ws(',', case 
        when a = 0 
         then null 
        else 'a' 
        end, case 
        when b = 0 
         then null 
        else 'b' 
        end, case 
        when c = 0 
         then null 
        else 'c' 
        end) 
      ), ',') l 
from c1; 

regexp_split_to_table() & concat_ws()