Postgres: имя столбца SELECT на основе логического значения - PullRequest
1 голос
/ 28 октября 2019

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

SELECT * FROM survey;
+----+-------+-------+-------+-------+
| id | bike  |  car  |  bus  | metro |
+----+-------+-------+-------+-------+
| 49 | false | false | true  | false |
| 51 | false | true  | false | false |
| 52 | false | false | false | true  |
| 53 | false | true  | false | false |
+----+-------+-------+-------+-------+

Затем я хочу выбрать только режимы, для которых значение равно true, так что конечный результат будет:

+----+-------+
| id | mode  |
+----+-------+
| 49 | bus   |
| 51 | car   |
| 52 | metro |
| 53 | car   |
+----+-------+

Как мне этого добиться?

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Вы можете использовать выражение case:

select
    id,
    case
        when bike  = true then 'bike'
        when car   = true then 'car'
        when bus   = true then 'bus'
        when metro = true then 'metro'
    end mode
from survey

Предполагается, что для каждой строки верным является только один столбец. Если нет, будет возвращено только значение первого соответствующего столбца.

0 голосов
/ 28 октября 2019

Вы можете использовать магию JSONB, чтобы избежать вывода списка всех столбцов:

select id, 
       (select k
        from jsonb_each_text(to_jsonb(s) - 'id') as x(k,v)
        where x.v = 'true') as mode
from survey s
order by id;

to_jsonb(s) - 'id' преобразует всю строку в значение JSON, где имя столбца является ключом, и удаляет ключ id. jsonb_each_text() затем возвращает все значения в виде текста и выбирает ключ, значение которого равно true

0 голосов
/ 28 октября 2019

Вы можете попробовать ниже путь -

select id, mode from
(
select id, 'bike' as mode,bike as val from tablename
union all
select id, 'car',car from tablename
union all
select id, 'bus',bus from tablename
union all
select id, 'metro',metrofrom tablename
)A where val=true
...